@plasius/gpu-renderer 0.2.47 → 0.2.48
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 +37 -0
- package/README.md +195 -0
- package/dist/index.cjs +314 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +313 -40
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.d.ts +30 -0
- package/src/index.js +2 -0
- package/src/native-scene-renderer.js +152 -7
- package/src/native-scene-shader.js +68 -18
- package/src/native-surface-materials.js +124 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js","../src/renderer-constants.js","../src/renderer-validation.js","../src/renderer-webgpu-runtime.js","../src/native-scene-shader.js","../src/native-scene-renderer.js","../src/canonical-wavefront-meshes.js","../src/animated-scene-renderer.js","../src/animated-gltf-model.js","../src/professional-animated-scene-renderer.js","../src/feedback-diagnostics.js","../src/wavefront-frame-runtime.js","../src/wavefront-workgroup.js","../src/wavefront-core.js","../src/wavefront-binary.js","../src/wavefront-materials.js","../src/wavefront-scene-normalizers.js","../src/wavefront-mesh-sources.js","../src/wavefront-packers.js","../src/wavefront-acceleration-builder.js","../src/wavefront-config.js","../src/wavefront-sampling.js","../src/wavefront-gpu-resources.js","../src/wavefront-bind-groups.js","../src/wavefront-runtime-support.js","../src/wavefront-gpu-synchronization.js","../src/wavefront-frame-telemetry.js","../src/wavefront-frame-stats.js","../src/wavefront-frame-encoder.js","../src/wavefront-frame-dispatcher.js","../src/wavefront-shader-bvh.js","../src/wavefront-shader-kernels.js","../src/wavefront-sampling-dimensions.js","../src/wavefront-shader-layout.js","../src/wavefront-shader-lighting.js","../src/wavefront-shader-materials.js","../src/wavefront-present-shader.js","../src/wavefront-shaders.js","../src/wavefront-pipelines.js","../src/wavefront-readbacks.js","../src/wavefront-reference.js","../src/wavefront-compute.js","../src/renderer-wavefront-plan.js","../src/wavefront-transport.js","../src/renderer-worker-profiles.js"],"sourcesContent":["export { createNativeSceneRenderer } from \"./native-scene-renderer.js\";\nexport { createCanonicalWavefrontMeshInputs } from \"./canonical-wavefront-meshes.js\";\nexport {\n createAnimatedSceneRenderer,\n} from \"./animated-scene-renderer.js\";\nexport {\n createProfessionalAnimatedSceneRenderer,\n} from \"./professional-animated-scene-renderer.js\";\nexport {\n bucketFeedbackGameFrameRate,\n bucketFeedbackGameFrameTime,\n bucketFeedbackGameViewport,\n createFeedbackGameDiagnosticSnapshot,\n} from \"./feedback-diagnostics.js\";\nexport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n createWavefrontPathTracingComputeConfig,\n createWavefrontPathTracingComputeRenderer,\n createWavefrontPathTracingComputeShaderSource,\n createWavefrontReferenceRay,\n estimateWavefrontPathTracingMemory,\n intersectWavefrontReferenceTriangle,\n normalizeWavefrontMesh,\n normalizeWavefrontSceneObject,\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n renderWavefrontPathTracingComputeFrame,\n rendererWavefrontComputeMode,\n rendererWavefrontComputeStatsStride,\n rendererWavefrontComputeWorkgroupSize,\n supportsWavefrontPathTracingCompute,\n traceWavefrontReferenceTriangles,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-compute.js\";\nexport {\n defaultRendererWorkerProfile,\n rendererAccelerationStructureUpdateClasses,\n rendererDebugOwner,\n rendererRayTracingStageOrder,\n rendererRepresentationBands,\n rendererWavefrontBufferSchemaVersion,\n rendererWavefrontHitTypes,\n rendererWavefrontPassOrder,\n rendererWavefrontQueuePairStrategy,\n rendererWorkerQueueClass,\n} from \"./renderer-constants.js\";\nexport {\n createWavefrontAdaptiveSamplingLevels,\n createWavefrontPathTracingPlan,\n} from \"./renderer-wavefront-plan.js\";\nexport {\n applyMediumTransmittance,\n beerLambertTransmittance,\n createMediumStack,\n createSpectralSamples,\n createTransportBranches,\n currentMediumId,\n enterMediumStack,\n exitMediumStack,\n resolveSpectralIor,\n transitionMediumStack,\n MAX_MEDIUM_STACK_DEPTH,\n MAX_TRANSPORT_BRANCHES,\n} from \"./wavefront-transport.js\";\nexport {\n normalizeWavefrontMaterialExtensions,\n} from \"./wavefront-materials.js\";\nexport {\n createRayTracingRenderPlan,\n getRendererWorkerManifest,\n getRendererWorkerProfile,\n rendererWorkerManifests,\n rendererWorkerProfileNames,\n rendererWorkerProfiles,\n} from \"./renderer-worker-profiles.js\";\nexport {\n bindRendererToXrManager,\n createGpuRenderer,\n createRendererDebugHooks,\n defaultRendererClearColor,\n supportsWebGpu,\n} from \"./renderer-webgpu-runtime.js\";\n","export const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nexport const DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\nexport const rendererDebugOwner = \"renderer\";\nexport const rendererWorkerQueueClass = \"render\";\nexport const defaultRendererWorkerProfile = \"realtime\";\nexport const rendererRepresentationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\nexport const rendererAccelerationStructureUpdateClasses = Object.freeze([\n \"static\",\n \"rigid-dynamic\",\n \"deforming\",\n \"proxy\",\n]);\nexport const rendererRayTracingStageOrder = Object.freeze([\n \"primaryVisibility\",\n \"shadowAssist\",\n \"opaqueFoundation\",\n \"rtDirectLighting\",\n \"rtReflections\",\n \"rtGlobalIllumination\",\n \"denoiseTemporal\",\n \"transparents\",\n \"composition\",\n \"present\",\n]);\nexport const rendererWavefrontBufferSchemaVersion = 1;\nexport const rendererWavefrontQueuePairStrategy = \"ping-pong-active-next\";\nexport const rendererWavefrontHitTypes = Object.freeze([\n \"surface\",\n \"emissive\",\n \"environment\",\n \"transparent\",\n \"miss\",\n]);\nexport const rendererWavefrontPassOrder = Object.freeze([\n \"generatePrimaryRays\",\n \"intersectActiveQueue\",\n \"resolveSurfaceRecords\",\n \"accumulateTerminalRadiance\",\n \"scatterContinuations\",\n \"compactAndSwapQueues\",\n]);\n","export function readPositiveNumber(name, value) {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n return value;\n}\n\nexport function readPositiveInteger(name, value) {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return value;\n}\n\nexport function readNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer.`);\n }\n return value;\n}\n\nexport function assertRendererIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n return value.trim();\n}\n","import {\n DEFAULT_CANVAS_SELECTOR,\n DEFAULT_CLEAR_COLOR,\n rendererDebugOwner,\n} from \"./renderer-constants.js\";\nimport { readPositiveNumber } from \"./renderer-validation.js\";\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseHexChannel(channel) {\n return parseInt(channel, 16) / 255;\n}\n\nfunction normalizeColor(value) {\n if (Array.isArray(value)) {\n const [r = 0, g = 0, b = 0, a = 1] = value;\n return [clamp01(Number(r) || 0), clamp01(Number(g) || 0), clamp01(Number(b) || 0), clamp01(Number(a) || 0)];\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (/^#[0-9a-f]{3}$/i.test(trimmed)) {\n const r = trimmed[1];\n const g = trimmed[2];\n const b = trimmed[3];\n return [\n parseHexChannel(r + r),\n parseHexChannel(g + g),\n parseHexChannel(b + b),\n 1,\n ];\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\n return [\n parseHexChannel(trimmed.slice(1, 3)),\n parseHexChannel(trimmed.slice(3, 5)),\n parseHexChannel(trimmed.slice(5, 7)),\n 1,\n ];\n }\n }\n\n return [...DEFAULT_CLEAR_COLOR];\n}\n\nfunction now() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction normalizeFrameId(value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(\"frameIdFactory must return a non-empty string.\");\n }\n return value.trim();\n}\n\nfunction resolveTargetFrameTimeMs(options, event) {\n const {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n } = options;\n\n if (typeof getTargetFrameTimeMs === \"function\") {\n const resolved = getTargetFrameTimeMs(event);\n return readPositiveNumber(\"getTargetFrameTimeMs()\", resolved);\n }\n\n if (fixedTargetFrameTimeMs !== undefined) {\n return fixedTargetFrameTimeMs;\n }\n\n if (targetFrameRate !== undefined) {\n return 1000 / targetFrameRate;\n }\n\n return undefined;\n}\n\nexport function createRendererDebugHooks(options = {}) {\n const {\n debugSession,\n targetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n onFrameStart,\n onFrameComplete,\n } = options;\n\n if (!debugSession || typeof debugSession.recordFrame !== \"function\") {\n throw new Error(\n \"debugSession must expose recordFrame(sample). Use @plasius/gpu-debug createGpuDebugSession().\"\n );\n }\n\n const fixedTargetFrameTimeMs = readPositiveNumber(\n \"targetFrameTimeMs\",\n targetFrameTimeMs\n );\n const fixedTargetFrameRate = readPositiveNumber(\n \"targetFrameRate\",\n targetFrameRate\n );\n\n if (\n fixedTargetFrameTimeMs !== undefined &&\n fixedTargetFrameRate !== undefined\n ) {\n throw new Error(\n \"Provide either targetFrameTimeMs or targetFrameRate, not both.\"\n );\n }\n\n if (\n getTargetFrameTimeMs !== undefined &&\n typeof getTargetFrameTimeMs !== \"function\"\n ) {\n throw new Error(\"getTargetFrameTimeMs must be a function when provided.\");\n }\n\n const resolvedOptions = {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate: fixedTargetFrameRate,\n getTargetFrameTimeMs,\n };\n\n return {\n onFrameStart(event) {\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n ...event,\n owner: rendererDebugOwner,\n });\n }\n },\n onFrameComplete(event) {\n const resolvedTargetFrameTimeMs = resolveTargetFrameTimeMs(\n resolvedOptions,\n event\n );\n\n if (\n typeof event.frameTimeMs === \"number\" &&\n Number.isFinite(event.frameTimeMs) &&\n event.frameTimeMs > 0\n ) {\n debugSession.recordFrame({\n frameId: event.frameId,\n frameTimeMs: event.frameTimeMs,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n ...event,\n owner: rendererDebugOwner,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n },\n };\n}\n\nfunction readNavigator(navigatorOverride) {\n const currentNavigator = navigatorOverride ?? globalThis.navigator;\n if (!currentNavigator || typeof currentNavigator !== \"object\") {\n throw new Error(\"Navigator unavailable. Provide a browser-like navigator object.\");\n }\n return currentNavigator;\n}\n\nfunction readDocument(documentOverride) {\n const doc = documentOverride ?? globalThis.document;\n if (!doc || typeof doc !== \"object\") {\n throw new Error(\"Document unavailable. Provide a browser-like document object.\");\n }\n return doc;\n}\n\nfunction resolveCanvas(canvasOrSelector, documentOverride) {\n if (canvasOrSelector && typeof canvasOrSelector === \"object\") {\n return canvasOrSelector;\n }\n\n const doc = readDocument(documentOverride);\n const selector =\n typeof canvasOrSelector === \"string\" && canvasOrSelector.trim().length > 0\n ? canvasOrSelector\n : DEFAULT_CANVAS_SELECTOR;\n const resolved = doc.querySelector(selector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector \"${selector}\".`);\n }\n return resolved;\n}\n\nfunction readGpu(navigatorOverride) {\n const currentNavigator = readNavigator(navigatorOverride);\n const gpu = currentNavigator.gpu;\n if (!gpu || typeof gpu.requestAdapter !== \"function\") {\n throw new Error(\"WebGPU runtime unavailable. navigator.gpu is missing.\");\n }\n return gpu;\n}\n\nfunction configureContext(context, device, format, alphaMode) {\n if (typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n context.configure({\n device,\n format,\n alphaMode,\n });\n}\n\nfunction createRenderPassDescriptor(view, clearColor) {\n return {\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n clearValue: {\n r: clearColor[0],\n g: clearColor[1],\n b: clearColor[2],\n a: clearColor[3],\n },\n storeOp: \"store\",\n },\n ],\n };\n}\n\nexport function supportsWebGpu(options = {}) {\n try {\n const gpu = readGpu(options.navigator);\n return Boolean(gpu);\n } catch {\n return false;\n }\n}\n\nexport async function createGpuRenderer(options = {}) {\n const {\n canvas,\n navigator: navigatorOverride,\n document: documentOverride,\n powerPreference = \"high-performance\",\n alpha = true,\n format,\n clearColor = DEFAULT_CLEAR_COLOR,\n requestAnimationFrame = globalThis.requestAnimationFrame?.bind(globalThis),\n cancelAnimationFrame = globalThis.cancelAnimationFrame?.bind(globalThis),\n frameIdFactory,\n onFrameStart,\n encodeFrame,\n onBeforeEncode,\n onAfterSubmit,\n onFrameComplete,\n } = options;\n\n const gpu = readGpu(navigatorOverride);\n const adapter = await gpu.requestAdapter({ powerPreference });\n if (!adapter) {\n throw new Error(\"Unable to obtain GPU adapter.\");\n }\n\n const device = await adapter.requestDevice();\n const targetCanvas = resolveCanvas(canvas, documentOverride);\n const context = targetCanvas.getContext?.(\"webgpu\");\n if (!context) {\n throw new Error(\"Unable to obtain WebGPU canvas context.\");\n }\n\n const resolvedFormat =\n format ||\n (typeof gpu.getPreferredCanvasFormat === \"function\"\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n configureContext(context, device, resolvedFormat, alpha ? \"premultiplied\" : \"opaque\");\n\n let running = false;\n let destroyed = false;\n let frame = 0;\n let lastTimestamp = 0;\n let rafId = null;\n let clear = normalizeColor(clearColor);\n let xrActive = false;\n let detachXrBinding = null;\n\n const renderOnce = (timestamp = now()) => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n\n const frameNumber = frame + 1;\n const frameId = normalizeFrameId(\n typeof frameIdFactory === \"function\"\n ? frameIdFactory({\n frame: frameNumber,\n timestamp,\n canvas: targetCanvas,\n xrActive,\n })\n : `renderer.frame.${frameNumber}`\n );\n const frameTimeMs =\n lastTimestamp > 0 ? Math.max(0, timestamp - lastTimestamp) : undefined;\n\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n const texture = context.getCurrentTexture?.();\n if (!texture || typeof texture.createView !== \"function\") {\n throw new Error(\"WebGPU context returned an invalid current texture.\");\n }\n\n const encoder = device.createCommandEncoder({\n label: `plasius.gpu-renderer.frame.${frame}`,\n });\n const view = texture.createView();\n\n if (typeof encodeFrame === \"function\") {\n encodeFrame({ device, context, encoder, view, canvas: targetCanvas, timestamp });\n } else {\n const pass = encoder.beginRenderPass(createRenderPassDescriptor(view, clear));\n\n if (typeof onBeforeEncode === \"function\") {\n onBeforeEncode({\n frame,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n encoder,\n pass,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof pass.end === \"function\") {\n pass.end();\n }\n }\n\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n\n frame = frameNumber;\n lastTimestamp = timestamp;\n\n if (typeof onAfterSubmit === \"function\") {\n onAfterSubmit({\n frame: frameNumber,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n return {\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n };\n };\n\n const tick = (timestamp) => {\n if (!running || destroyed) {\n return;\n }\n renderOnce(timestamp);\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const start = () => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n if (running) {\n return false;\n }\n running = true;\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n } else {\n renderOnce();\n }\n return true;\n };\n\n const stop = () => {\n if (!running) {\n return false;\n }\n running = false;\n if (rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(rafId);\n }\n rafId = null;\n return true;\n };\n\n const resize = (cssWidth, cssHeight, devicePixelRatio = globalThis.devicePixelRatio ?? 1) => {\n const width = Math.max(1, Math.floor(cssWidth * devicePixelRatio));\n const height = Math.max(1, Math.floor(cssHeight * devicePixelRatio));\n targetCanvas.width = width;\n targetCanvas.height = height;\n if (targetCanvas.style) {\n targetCanvas.style.width = `${Math.max(1, Math.floor(cssWidth))}px`;\n targetCanvas.style.height = `${Math.max(1, Math.floor(cssHeight))}px`;\n }\n return { width, height };\n };\n\n const setClearColor = (value) => {\n clear = normalizeColor(value);\n return [...clear];\n };\n\n const setXrActive = (active) => {\n xrActive = Boolean(active);\n };\n\n const getSnapshot = () => {\n const width = Number(targetCanvas.width) || 0;\n const height = Number(targetCanvas.height) || 0;\n return {\n running,\n frame,\n lastTimestamp,\n format: resolvedFormat,\n width,\n height,\n xrActive,\n };\n };\n\n const renderer = {\n canvas: targetCanvas,\n context,\n device,\n format: resolvedFormat,\n renderOnce,\n start,\n stop,\n resize,\n setClearColor,\n setXrActive,\n getSnapshot,\n bindXrManager(xrManager, bindOptions = {}) {\n if (detachXrBinding) {\n detachXrBinding();\n }\n detachXrBinding = bindRendererToXrManager(renderer, xrManager, bindOptions);\n return detachXrBinding;\n },\n destroy() {\n stop();\n destroyed = true;\n if (detachXrBinding) {\n detachXrBinding();\n detachXrBinding = null;\n }\n if (typeof context.unconfigure === \"function\") {\n context.unconfigure();\n }\n },\n };\n\n return renderer;\n}\n\nfunction snapshotFromXrManager(xrManager) {\n if (xrManager && typeof xrManager.getState === \"function\") {\n return xrManager.getState();\n }\n if (xrManager?.store && typeof xrManager.store.getSnapshot === \"function\") {\n return xrManager.store.getSnapshot();\n }\n return null;\n}\n\nexport function bindRendererToXrManager(renderer, xrManager, options = {}) {\n if (!xrManager || typeof xrManager.subscribe !== \"function\") {\n throw new Error(\"XR manager must expose subscribe(listener). Use @plasius/gpu-xr createXrManager().\");\n }\n\n const { onSessionStart, onSessionEnd } = options;\n let previousSession = null;\n\n const applyState = (state) => {\n const session = state?.activeSession ?? null;\n if (session === previousSession) {\n return;\n }\n\n previousSession = session;\n\n if (typeof renderer.setXrActive === \"function\") {\n renderer.setXrActive(Boolean(session));\n }\n\n if (session && typeof onSessionStart === \"function\") {\n onSessionStart(session, renderer);\n }\n\n if (!session && typeof onSessionEnd === \"function\") {\n onSessionEnd(renderer);\n }\n };\n\n applyState(snapshotFromXrManager(xrManager));\n return xrManager.subscribe(applyState);\n}\n\nexport const defaultRendererClearColor = DEFAULT_CLEAR_COLOR;\n","// Raster lighting intentionally differs from the wavefront path tracer. It makes\n// no claim of global illumination or ray tracing. All colours remain linear until\n// presentation; the generated harbour materials use continuous world-space detail.\nexport const nativeSceneShader = /* wgsl */ `\nstruct Frame {\n eye: vec4f, right: vec4f, up: vec4f, forward: vec4f,\n settings: vec4f, sun: vec4f,\n lightRight: vec4f, lightUp: vec4f, lightForward: vec4f, lightOrigin: vec4f,\n viewport: vec4f, wakes: array<vec4f, 4>, info: vec4f,\n};\n@group(0) @binding(0) var<uniform> frame: Frame;\n@group(1) @binding(0) var shadowMap: texture_depth_2d;\n@group(1) @binding(1) var shadowSampler: sampler_comparison;\n@group(2) @binding(0) var reflectionMap: texture_2d<f32>;\n@group(2) @binding(1) var reflectionSampler: sampler;\nstruct Surface {\n @builtin(position) clip: vec4f,\n @location(0) world: vec3f, @location(1) normal: vec3f,\n @location(2) colour: vec3f, @location(3) material: vec3f,\n};\nfn project(p: vec3f) -> vec4f {\n let d = p - frame.eye.xyz;\n let z = dot(d, frame.forward.xyz);\n return vec4f(dot(d, frame.right.xyz) / (frame.settings.x * frame.settings.y),\n dot(d, frame.up.xyz) / frame.settings.x, (z - 0.08) * 500.0 / 499.92, z);\n}\nfn lightProject(p: vec3f) -> vec4f {\n let d = p - frame.lightOrigin.xyz;\n return vec4f(dot(d, frame.lightRight.xyz) / 34.0,\n dot(d, frame.lightUp.xyz) / 34.0, dot(d, frame.lightForward.xyz) / 100.0, 1.0);\n}\n@vertex fn surfaceVertex(@location(0) p: vec3f, @location(1) n: vec3f,\n @location(2) c: vec3f, @location(3) m: vec3f) -> Surface {\n return Surface(project(p), p, n, c, m);\n}\n@vertex fn shadowVertex(@location(0) p: vec3f) -> @builtin(position) vec4f {\n return lightProject(p);\n}\n@vertex fn fullscreenVertex(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3));\n return vec4f(positions[i], 1, 1);\n}\nfn cameraRay(pixel: vec2f) -> vec3f {\n let uv = pixel / frame.viewport.xy * 2.0 - 1.0;\n return normalize(frame.forward.xyz + frame.right.xyz * uv.x * frame.settings.x * frame.settings.y\n - frame.up.xyz * uv.y * frame.settings.x);\n}\nfn display(c: vec3f) -> vec3f {\n let x = max(c * frame.settings.w, vec3f(0));\n let mapped = clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), vec3f(0), vec3f(1));\n return pow(mapped, vec3f(1.0 / 2.2));\n}\nfn hash(p: vec3f) -> f32 { return fract(sin(dot(p, vec3f(127.1, 311.7, 74.7))) * 43758.5453); }\nfn noise(p: vec3f) -> f32 {\n let i = floor(p); let f = fract(p); let u = f * f * (3.0 - 2.0 * f);\n return mix(mix(mix(hash(i), hash(i + vec3f(1,0,0)), u.x),\n mix(hash(i + vec3f(0,1,0)), hash(i + vec3f(1,1,0)), u.x), u.y),\n mix(mix(hash(i + vec3f(0,0,1)), hash(i + vec3f(1,0,1)), u.x),\n mix(hash(i + vec3f(0,1,1)), hash(i + vec3f(1,1,1)), u.x), u.y), u.z);\n}\nfn sky(ray: vec3f) -> vec3f {\n let elevation = pow(clamp(ray.y * 0.7 + 0.16, 0.0, 1.0), 0.6);\n var c = mix(vec3f(0.42, 0.53, 0.61), vec3f(0.07, 0.19, 0.37), elevation);\n let sunAngle = dot(ray, frame.sun.xyz);\n c += vec3f(1.0, 0.73, 0.43) * pow(max(sunAngle, 0.0), 64.0) * 0.35;\n c += vec3f(4.0, 3.2, 2.1) * smoothstep(0.99965, 0.99985, sunAngle);\n let cloudPoint = ray / max(0.12, ray.y) * 2.1 + vec3f(0, 0, 8);\n let cloud = smoothstep(0.49, 0.77, noise(cloudPoint) * 0.65 + noise(cloudPoint * 2.1) * 0.35);\n c = mix(c, vec3f(0.85, 0.86, 0.82), cloud * smoothstep(0.03, 0.35, ray.y) * 0.65);\n return c;\n}\n@fragment fn skyFragment(@builtin(position) pixel: vec4f) -> @location(0) vec4f {\n return vec4f(display(sky(cameraRay(pixel.xy))), 1);\n}\nfn visibility(p: vec3f, n: vec3f) -> f32 {\n let q = lightProject(p + n * 0.035).xyz;\n let uv = vec2f(q.x * 0.5 + 0.5, 0.5 - q.y * 0.5);\n if (any(uv < vec2f(0.005)) || any(uv > vec2f(0.995)) || q.z < 0.0 || q.z > 1.0) { return 1.0; }\n var result = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n result += textureSampleCompareLevel(shadowMap, shadowSampler, uv + vec2f(f32(x), f32(y)) / 2048.0, q.z - 0.0006);\n }\n }\n return result / 9.0;\n}\nfn brdf(c: vec3f, n: vec3f, v: vec3f, roughness: f32, metal: f32) -> vec3f {\n let l = frame.sun.xyz; let h = normalize(l + v);\n let nl = max(dot(n,l),0.0); let nv = max(dot(n,v),0.001);\n let nh = max(dot(n,h),0.0); let vh = max(dot(v,h),0.0);\n let a = max(0.035, roughness * roughness); let a2 = a * a;\n let d = a2 / max(0.00001, 3.14159265 * pow(nh * nh * (a2 - 1.0) + 1.0, 2.0));\n let k = pow(roughness + 1.0, 2.0) / 8.0;\n let g = (nl / (nl * (1.0-k) + k)) * (nv / (nv * (1.0-k) + k));\n let f0 = mix(vec3f(0.04), c, metal);\n let f = f0 + (1.0-f0) * pow(1.0-vh, 5.0);\n return ((1.0-f) * (1.0-metal) * c / 3.14159265 + d * g * f / max(0.001, 4.0*nl*nv)) * nl;\n}\nfn fog(c: vec3f, p: vec3f) -> vec3f {\n let amount = 1.0 - exp(-distance(frame.eye.xyz, p) * 0.0018);\n return mix(c, vec3f(0.32, 0.44, 0.55), amount);\n}\nfn surfaceRadiance(s: Surface, front: bool) -> vec3f {\n let facing = select(select(-1.0,1.0,front),select(1.0,-1.0,front),frame.info.y>0.5);\n var n = normalize(s.normal) * facing;\n let v = normalize(frame.eye.xyz - s.world);\n var c = s.colour;\n if (s.material.z > 2.5) {\n let rock = smoothstep(0.45,0.68,noise(s.world*0.27));\n c = mix(c,vec3f(0.16,0.145,0.11),rock*0.7);\n c *= 0.75+0.45*noise(s.world*2.4);\n n = normalize(n+vec3f(noise(s.world*4.0)-0.5,0,noise(s.world*4.0+vec3f(13))-0.5)*0.28);\n } else if (s.material.z > 0.5 && s.material.z < 1.5) {\n let grain = noise(s.world * vec3f(18, 3, 1.6));\n c *= 0.82 + 0.30 * grain;\n } else if (s.material.z > 1.5) { c *= 0.88 + 0.18 * noise(s.world * 12.0); }\n let hemi = mix(vec3f(0.06,0.05,0.035), vec3f(0.16,0.22,0.29), n.y * 0.5 + 0.5);\n let direct = brdf(c, n, v, s.material.x, s.material.y) * vec3f(3.0, 2.65, 2.15) * visibility(s.world, n);\n let ambient = c * hemi * (1.0 - s.material.y * 0.7);\n let env = sky(reflect(-v,n)) * mix(vec3f(0.04), c, s.material.y) * (1.0-s.material.x) * 0.30;\n return fog(direct + ambient + env, s.world);\n}\n@fragment fn surfaceFragment(s: Surface, @builtin(front_facing) front: bool) -> @location(0) vec4f {\n return vec4f(display(surfaceRadiance(s,front)),1);\n}\nfn wave(p: vec2f) -> f32 {\n let t = frame.settings.z;\n return sin(dot(p,vec2f(0.35,0.23))-t*0.85)*0.13\n + sin(dot(p,vec2f(-0.61,0.42))+t*1.12)*0.065\n + sin(dot(p,vec2f(1.2,0.83))-t*1.4)*0.025\n + sin(dot(p,vec2f(3.1,-2.1))+t*1.8)*0.009;\n}\nstruct WaterResult { @location(0) colour: vec4f, @builtin(frag_depth) depth: f32 };\n@fragment fn waterFragment(@builtin(position) pixel: vec4f) -> WaterResult {\n let ray = cameraRay(pixel.xy);\n if (ray.y > -0.001) { discard; }\n var dist = (frame.viewport.z - frame.eye.y) / ray.y;\n var p = frame.eye.xyz + ray * dist;\n for (var i=0; i<3; i++) {\n dist = (frame.viewport.z + wave(p.xz) - frame.eye.y) / ray.y;\n p = frame.eye.xyz + ray * dist;\n }\n if (dist < 0.08 || dist > 499.0) { discard; }\n let eps = 0.03;\n let waveNormal = normalize(vec3f((wave(p.xz-vec2f(eps,0))-wave(p.xz+vec2f(eps,0)))/(2.0*eps),\n 1.0, (wave(p.xz-vec2f(0,eps))-wave(p.xz+vec2f(0,eps)))/(2.0*eps)));\n let n = normalize(mix(waveNormal,vec3f(0,1,0),smoothstep(35.0,150.0,dist)));\n let v = -ray;\n let fresnel = 0.02 + 0.98 * pow(1.0-max(dot(n,v),0.0),5.0);\n let uv = clamp(pixel.xy / frame.viewport.xy + n.xz * 0.018, vec2f(0.002), vec2f(0.998));\n // Reflection target is HDR linear; tone mapping happens once after mixing.\n let reflected = textureSampleLevel(reflectionMap, reflectionSampler, uv, 0).rgb;\n let shadow = visibility(p, n);\n var c = mix(vec3f(0.008,0.05,0.065) * (0.5+0.5*shadow), reflected, fresnel);\n c += brdf(vec3f(0.01),n,v,0.14,0.0) * vec3f(2.5,2.15,1.7) * shadow;\n var foam = 0.0;\n for (var i=0u; i<4u; i++) {\n if (f32(i) >= frame.info.x) { break; }\n let w = frame.wakes[i]; let delta = p.xz - w.xy;\n let along = dot(delta, vec2f(sin(w.z), cos(w.z)));\n let across = abs(dot(delta,vec2f(cos(w.z),-sin(w.z))));\n let ribbon = exp(-pow((across - max(0.0,-along)*0.28 - 0.65)*4.0,2.0));\n foam += ribbon * (1.0-smoothstep(-1.0,0.5,along)) * exp(min(0.0,along)*0.25) * (0.4+0.6*noise(vec3f(p.x*5.0,p.z*5.0,frame.settings.z*0.5)));\n }\n c = mix(c,vec3f(0.48,0.61,0.62),clamp(foam*0.42,0.0,0.55));\n let clip = project(p);\n return WaterResult(vec4f(display(fog(c,p)),1),clip.z/clip.w);\n}\n// Keep reflection radiance linear, including sky. Reusing the lighting calculation\n// rather than sampling a screenshot avoids double tone mapping on the water.\n@fragment fn reflectionSky(@builtin(position) pixel: vec4f) -> @location(0) vec4f {\n return vec4f(sky(cameraRay(pixel.xy)),1);\n}\n@fragment fn reflectionSurface(s: Surface, @builtin(front_facing) front: bool) -> @location(0) vec4f {\n if (s.world.y < frame.viewport.z) { discard; }\n return vec4f(surfaceRadiance(s,front),1);\n}\n`;\n","import { createGpuRenderer } from \"./renderer-webgpu-runtime.js\";\nimport { nativeSceneShader } from \"./native-scene-shader.js\";\n\nconst STRIDE = 12;\nconst UNIFORM_BYTES = 256;\nconst SHADOW_SIZE = 2048;\nconst sub = (a, b) => a.map((v, i) => v - b[i]);\nconst cross = (a, b) => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\nconst unit = (a) => {\n const length = Math.hypot(...a);\n return a.map((v) => v / length);\n};\nconst finiteVector = (a) =>\n Array.isArray(a) && a.length === 3 && a.every(Number.isFinite);\n\nfunction validateFrame(frame, maxVertices) {\n const { vertices, camera, time = 0 } = frame ?? {};\n if (\n !(vertices instanceof Float32Array) ||\n vertices.length % (STRIDE * 3) !== 0 ||\n vertices.length > maxVertices * STRIDE ||\n !vertices.every(Number.isFinite)\n ) {\n throw new Error(\n `vertices must contain bounded, finite interleaved triangles (12 floats per vertex); received ${vertices?.length ?? 0} floats; first nonfinite component ${vertices instanceof Float32Array ? vertices.findIndex((v) => !Number.isFinite(v)) : \"unknown\"}.`,\n );\n }\n if (\n !finiteVector(camera?.eye) ||\n !finiteVector(camera?.target) ||\n Math.hypot(...sub(camera.eye, camera.target)) < 0.001 ||\n !Number.isFinite(camera.fov ?? 54) ||\n (camera.fov ?? 54) < 10 ||\n (camera.fov ?? 54) > 120\n ) {\n throw new Error(\n \"camera must provide distinct finite eye/target vectors and a 10–120 degree fov.\",\n );\n }\n if (!Number.isFinite(time)) throw new Error(\"time must be finite.\");\n if (!Number.isFinite(frame.waterLevel ?? 0))\n throw new Error(\"waterLevel must be finite.\");\n if (\n frame.wakes !== undefined &&\n (!Array.isArray(frame.wakes) ||\n frame.wakes.length > 4 ||\n frame.wakes.some(\n (w) => !Array.isArray(w) || w.length !== 3 || !w.every(Number.isFinite),\n ))\n ) {\n throw new Error(\n \"wakes must contain at most four finite [x, z, heading] entries.\",\n );\n }\n return { ...frame, time };\n}\n\nfunction frameUniforms(frame, width, height, reflected = false) {\n const eye = [...frame.camera.eye];\n let forward = unit(sub(frame.camera.target, eye));\n const referenceUp = Math.abs(forward[1]) > 0.999 ? [0, 0, 1] : [0, 1, 0];\n const right = unit(cross(forward, referenceUp));\n const up = unit(cross(right, forward));\n const waterLevel = frame.waterLevel ?? 0;\n if (reflected) {\n eye[1] = 2 * waterLevel - eye[1];\n forward = [forward[0], -forward[1], forward[2]];\n right[1] *= -1;\n up[1] *= -1;\n }\n const sun = unit([-0.62, 0.48, 0.62]);\n const lightForward = sun.map((x) => -x);\n const lightRight = unit(cross(lightForward, [0, 1, 0]));\n const lightUp = unit(cross(lightRight, lightForward));\n const uniforms = new Float32Array(64);\n uniforms.set(eye, 0);\n uniforms.set(right, 4);\n uniforms.set(up, 8);\n uniforms.set(forward, 12);\n uniforms.set(\n [\n Math.tan(((frame.camera.fov ?? 54) * Math.PI) / 360),\n width / height,\n frame.time,\n 0.86,\n ],\n 16,\n );\n uniforms.set(sun, 20);\n uniforms.set(lightRight, 24);\n uniforms.set(lightUp, 28);\n uniforms.set(lightForward, 32);\n uniforms.set([sun[0] * 45, sun[1] * 45, sun[2] * 45 + 4], 36);\n uniforms.set([width, height, waterLevel, 0], 40);\n (frame.wakes ?? []).forEach((wake, index) =>\n uniforms.set([...wake, 0], 44 + index * 4),\n );\n uniforms.set([(frame.wakes ?? []).length, reflected ? 1 : 0, 0, 0], 60);\n return uniforms;\n}\n\n/** Native raster surfaces. The caller owns simulation, animation and scheduling. */\nexport async function createNativeSceneRenderer(options = {}) {\n const maxVertices = options.maxVertices ?? 300_000;\n if (\n !Number.isInteger(maxVertices) ||\n maxVertices < 3 ||\n maxVertices > 600_000\n ) {\n throw new Error(\"maxVertices must be an integer between 3 and 600000.\");\n }\n let base;\n let destroyed = false;\n let available = true;\n let targets = null;\n let vertexBuffer = null;\n let vertexCapacity = 0;\n let pendingFrame = null;\n let submittedFrames = 0;\n let vertexCount = 0;\n const owned = new Set();\n const own = (resource) => {\n owned.add(resource);\n return resource;\n };\n const release = (resource) => {\n resource.destroy();\n owned.delete(resource);\n };\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n base?.destroy();\n for (const resource of owned) resource.destroy();\n owned.clear();\n base?.device.destroy?.();\n };\n\n try {\n base = await createGpuRenderer({\n ...options,\n alpha: false,\n encodeFrame: encode,\n });\n const { device, format } = base;\n device.lost?.then(() => {\n available = false;\n if (!destroyed)\n options.onUnavailable?.(\n \"WebGPU device lost. Reload the demo to reconnect.\",\n );\n });\n const module = device.createShaderModule({\n label: \"plasius.native-scene\",\n code: nativeSceneShader,\n });\n const compilation = await module.getCompilationInfo?.();\n const shaderErrors =\n compilation?.messages.filter((m) => m.type === \"error\") ?? [];\n if (shaderErrors.length)\n throw new Error(\n `Native scene shader compilation failed: ${shaderErrors.map((m) => `${m.lineNum}: ${m.message}`).join(\"; \")}`,\n );\n const uniformLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: 3,\n buffer: { type: \"uniform\", minBindingSize: UNIFORM_BYTES },\n },\n ],\n });\n const shadowLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: 2, texture: { sampleType: \"depth\" } },\n { binding: 1, visibility: 2, sampler: { type: \"comparison\" } },\n ],\n });\n const reflectionLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: 2, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: 2, sampler: { type: \"filtering\" } },\n ],\n });\n const uniformBuffer = own(\n device.createBuffer({\n label: \"native.frame\",\n size: UNIFORM_BYTES,\n usage: 0x48,\n }),\n );\n const reflectionBuffer = own(\n device.createBuffer({\n label: \"native.reflected-frame\",\n size: UNIFORM_BYTES,\n usage: 0x48,\n }),\n );\n const bindUniform = (buffer) =>\n device.createBindGroup({\n layout: uniformLayout,\n entries: [{ binding: 0, resource: { buffer } }],\n });\n const mainGroup = bindUniform(uniformBuffer);\n const reflectedGroup = bindUniform(reflectionBuffer);\n const shadowTexture = own(\n device.createTexture({\n label: \"native.shadow\",\n size: [SHADOW_SIZE, SHADOW_SIZE],\n format: \"depth32float\",\n usage: 0x14,\n }),\n );\n const shadowView = shadowTexture.createView();\n const shadowGroup = device.createBindGroup({\n layout: shadowLayout,\n entries: [\n { binding: 0, resource: shadowView },\n {\n binding: 1,\n resource: device.createSampler({\n compare: \"less-equal\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n }),\n },\n ],\n });\n const reflectionSampler = device.createSampler({\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n const attributes = [0, 1, 2, 3].map((i) => ({\n shaderLocation: i,\n offset: i * 12,\n format: \"float32x3\",\n }));\n const createPipeline =\n device.createRenderPipelineAsync?.bind(device) ??\n device.createRenderPipeline.bind(device);\n const pipeline = (\n label,\n vertex,\n fragment,\n colourFormat,\n samples,\n layouts,\n geometry = false,\n ) =>\n createPipeline({\n label: `native.${label}`,\n layout: device.createPipelineLayout({ bindGroupLayouts: layouts }),\n vertex: {\n module,\n entryPoint: vertex,\n ...(geometry\n ? {\n buffers: [\n {\n arrayStride: STRIDE * 4,\n attributes:\n vertex === \"shadowVertex\"\n ? attributes.slice(0, 1)\n : attributes,\n },\n ],\n }\n : {}),\n },\n ...(fragment\n ? {\n fragment: {\n module,\n entryPoint: fragment,\n targets: [{ format: colourFormat }],\n },\n }\n : {}),\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: \"depth32float\",\n depthWriteEnabled: label !== \"sky\" && label !== \"reflection-sky\",\n depthCompare: \"less-equal\",\n },\n multisample: { count: samples },\n });\n const shadowPipeline = await pipeline(\n \"shadow\",\n \"shadowVertex\",\n null,\n null,\n 1,\n [uniformLayout],\n true,\n );\n const surfacePipeline = await pipeline(\n \"surface\",\n \"surfaceVertex\",\n \"surfaceFragment\",\n format,\n 4,\n [uniformLayout, shadowLayout],\n true,\n );\n const skyPipeline = await pipeline(\n \"sky\",\n \"fullscreenVertex\",\n \"skyFragment\",\n format,\n 4,\n [uniformLayout],\n );\n const waterPipeline = await pipeline(\n \"water\",\n \"fullscreenVertex\",\n \"waterFragment\",\n format,\n 4,\n [uniformLayout, shadowLayout, reflectionLayout],\n );\n const reflectedSurfacePipeline = await pipeline(\n \"reflection-surface\",\n \"surfaceVertex\",\n \"reflectionSurface\",\n \"rgba16float\",\n 1,\n [uniformLayout, shadowLayout],\n true,\n );\n const reflectedSkyPipeline = await pipeline(\n \"reflection-sky\",\n \"fullscreenVertex\",\n \"reflectionSky\",\n \"rgba16float\",\n 1,\n [uniformLayout],\n );\n\n function ensureTargets() {\n const limit = Math.min(device.limits.maxTextureDimension2D, 3840);\n const requestedWidth = Math.max(1, Number(base.canvas.width) || 1);\n const requestedHeight = Math.max(1, Number(base.canvas.height) || 1);\n const scale = Math.min(\n 1,\n limit / requestedWidth,\n limit / requestedHeight,\n Math.sqrt((1920 * 1080) / (requestedWidth * requestedHeight)),\n );\n const width = Math.max(1, Math.floor(requestedWidth * scale));\n const height = Math.max(1, Math.floor(requestedHeight * scale));\n base.canvas.width = width;\n base.canvas.height = height;\n if (targets?.width === width && targets?.height === height) return;\n if (targets) for (const texture of targets.textures) release(texture);\n const reflectionWidth = Math.min(1280, Math.max(1, Math.ceil(width / 2)));\n const reflectionHeight = Math.max(\n 1,\n Math.round((height * reflectionWidth) / width),\n );\n const texture = (\n label,\n w,\n h,\n pixelFormat,\n sampleCount = 1,\n usage = 0x10,\n ) =>\n own(\n device.createTexture({\n label,\n size: [w, h],\n format: pixelFormat,\n sampleCount,\n usage,\n }),\n );\n const colour = texture(\"native.msaa-colour\", width, height, format, 4);\n const depth = texture(\n \"native.msaa-depth\",\n width,\n height,\n \"depth32float\",\n 4,\n );\n const reflection = texture(\n \"native.reflection\",\n reflectionWidth,\n reflectionHeight,\n \"rgba16float\",\n 1,\n 0x14,\n );\n const reflectionDepth = texture(\n \"native.reflection-depth\",\n reflectionWidth,\n reflectionHeight,\n \"depth32float\",\n );\n const reflectionView = reflection.createView();\n targets = {\n width,\n height,\n reflectionWidth,\n reflectionHeight,\n colour: colour.createView(),\n depth: depth.createView(),\n reflection: reflectionView,\n reflectionDepth: reflectionDepth.createView(),\n textures: [colour, depth, reflection, reflectionDepth],\n reflectionGroup: device.createBindGroup({\n layout: reflectionLayout,\n entries: [\n { binding: 0, resource: reflectionView },\n { binding: 1, resource: reflectionSampler },\n ],\n }),\n };\n }\n\n function encode({ encoder, view }) {\n const depthAttachment = (depthView) => ({\n view: depthView,\n depthLoadOp: \"clear\",\n depthClearValue: 1,\n depthStoreOp: \"store\",\n });\n const drawGeometry = (pass, p, uniforms) => {\n pass.setPipeline(p);\n pass.setBindGroup(0, uniforms);\n if (p !== shadowPipeline) pass.setBindGroup(1, shadowGroup);\n if (vertexCount > 0) {\n pass.setVertexBuffer(0, vertexBuffer);\n pass.draw(vertexCount);\n }\n };\n const shadowPass = encoder.beginRenderPass({\n label: \"native.shadow\",\n colorAttachments: [],\n depthStencilAttachment: depthAttachment(shadowView),\n });\n drawGeometry(shadowPass, shadowPipeline, mainGroup);\n shadowPass.end();\n const reflectedPass = encoder.beginRenderPass({\n label: \"native.reflection\",\n colorAttachments: [\n {\n view: targets.reflection,\n loadOp: \"clear\",\n storeOp: \"store\",\n clearValue: [0, 0, 0, 1],\n },\n ],\n depthStencilAttachment: depthAttachment(targets.reflectionDepth),\n });\n reflectedPass.setPipeline(reflectedSkyPipeline);\n reflectedPass.setBindGroup(0, reflectedGroup);\n reflectedPass.draw(3);\n drawGeometry(reflectedPass, reflectedSurfacePipeline, reflectedGroup);\n reflectedPass.end();\n const pass = encoder.beginRenderPass({\n label: \"native.scene\",\n colorAttachments: [\n {\n view: targets.colour,\n resolveTarget: view,\n loadOp: \"clear\",\n storeOp: \"discard\",\n clearValue: [0, 0, 0, 1],\n },\n ],\n depthStencilAttachment: depthAttachment(targets.depth),\n });\n pass.setPipeline(skyPipeline);\n pass.setBindGroup(0, mainGroup);\n pass.draw(3);\n if (pendingFrame.water !== false) {\n pass.setPipeline(waterPipeline);\n pass.setBindGroup(1, shadowGroup);\n pass.setBindGroup(2, targets.reflectionGroup);\n pass.draw(3);\n }\n drawGeometry(pass, surfacePipeline, mainGroup);\n pass.end();\n }\n\n return {\n render(input) {\n if (destroyed) throw new Error(\"Native scene renderer was destroyed.\");\n if (!available) throw new Error(\"WebGPU device was lost.\");\n pendingFrame = validateFrame(input, maxVertices);\n const data = pendingFrame.vertices;\n ensureTargets();\n if (data.byteLength > vertexCapacity) {\n if (vertexBuffer) release(vertexBuffer);\n vertexCapacity = Math.min(\n maxVertices * STRIDE * 4,\n Math.max(4096, 2 ** Math.ceil(Math.log2(data.byteLength))),\n );\n vertexBuffer = own(\n device.createBuffer({\n label: \"native.surface-vertices\",\n size: vertexCapacity,\n usage: 0x28,\n }),\n );\n }\n vertexCount = data.length / STRIDE;\n if (data.byteLength) device.queue.writeBuffer(vertexBuffer, 0, data);\n device.queue.writeBuffer(\n uniformBuffer,\n 0,\n frameUniforms(pendingFrame, targets.width, targets.height),\n );\n device.queue.writeBuffer(\n reflectionBuffer,\n 0,\n frameUniforms(\n pendingFrame,\n targets.reflectionWidth,\n targets.reflectionHeight,\n true,\n ),\n );\n base.renderOnce(pendingFrame.time * 1000);\n submittedFrames++;\n return this.getSnapshot();\n },\n getSnapshot() {\n return {\n backend: \"webgpu-raster\",\n available: available && !destroyed,\n submittedFrames,\n vertexCount,\n shadowMapSize: SHADOW_SIZE,\n samples: 4,\n width: targets?.width ?? 0,\n height: targets?.height ?? 0,\n };\n },\n destroy,\n };\n } catch (error) {\n destroy();\n throw error;\n }\n}\n","const STANDARD_TEXTURE_BINDINGS = Object.freeze([\n [\"baseColor\", \"baseColorTexture\"],\n [\"metallicRoughness\", \"metallicRoughnessTexture\"],\n [\"normal\", \"normalTexture\"],\n [\"occlusion\", \"occlusionTexture\"],\n [\"emissive\", \"emissiveTexture\"],\n]);\n\nconst EXTENSION_TEXTURE_BINDINGS = Object.freeze([\n [\"clearcoat\", \"clearcoat\", \"clearcoatTexture\"],\n [\"clearcoatRoughness\", \"clearcoat\", \"clearcoatRoughnessTexture\"],\n [\"clearcoatNormal\", \"clearcoat\", \"clearcoatNormalTexture\"],\n [\"transmission\", \"transmission\", \"transmissionTexture\"],\n [\"sheenColor\", \"sheen\", \"sheenColorTexture\"],\n [\"sheenRoughness\", \"sheen\", \"sheenRoughnessTexture\"],\n]);\n\nfunction requireArray(value, label) {\n if (!Array.isArray(value)) {\n throw new TypeError(`${label} must be an array.`);\n }\n return value;\n}\n\nfunction requireMap(value, label) {\n if (!value || typeof value !== \"object\" || typeof value.get !== \"function\") {\n throw new TypeError(`${label} must provide a ReadonlyMap-compatible get method.`);\n }\n return value;\n}\n\nfunction textureSample(binding, textures, label, extra = {}) {\n if (binding === undefined || binding === null) {\n return undefined;\n }\n\n const sample = textures.get(binding.textureId);\n if (!sample) {\n throw new Error(`Missing decoded texture sample ${binding.textureId} for ${label}.`);\n }\n const width = Number(sample.width);\n const height = Number(sample.height);\n const data = sample.data;\n const dataLength = data && typeof data.length === \"number\" ? data.length : -1;\n if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1) {\n throw new TypeError(`Decoded texture sample ${binding.textureId} has invalid dimensions.`);\n }\n if (width > 4_096 || height > 4_096 || width * height > 4_096 * 4_096) {\n throw new RangeError(`Decoded texture sample ${binding.textureId} exceeds the 4096-pixel resource limit.`);\n }\n if (!(Array.isArray(data) || ArrayBuffer.isView(data)) || dataLength < width * height * 4) {\n throw new TypeError(`Decoded texture sample ${binding.textureId} must contain width × height × 4 RGBA values.`);\n }\n\n return Object.freeze({\n ...sample,\n ...(binding.texCoordSet === undefined ? {} : { texCoord: binding.texCoordSet }),\n ...extra,\n });\n}\n\nfunction cloneMaterialExtensions(material, textures) {\n const extensions = { ...(material.extensions ?? {}) };\n if (material.workflow === \"unlit\") {\n const unlitKey = \"KHR_materials_unlit\";\n const unlitValue = extensions[unlitKey] ?? extensions.unlit ?? {};\n if (typeof unlitValue !== \"object\" || unlitValue === null || Array.isArray(unlitValue)) {\n throw new TypeError(`Canonical material extension ${unlitKey} must be an object.`);\n }\n extensions[unlitKey] = { ...unlitValue, enabled: true };\n }\n for (const [bindingName, extensionName, textureKey] of EXTENSION_TEXTURE_BINDINGS) {\n const binding = material.textures?.[bindingName];\n if (!binding) {\n continue;\n }\n\n const extensionKey = `KHR_materials_${extensionName}`;\n const extensionValue = extensions[extensionKey] ?? extensions[extensionName] ?? {};\n if (typeof extensionValue !== \"object\" || extensionValue === null || Array.isArray(extensionValue)) {\n throw new TypeError(`Canonical material extension ${extensionKey} must be an object.`);\n }\n extensions[extensionKey] = {\n ...extensionValue,\n [textureKey]: textureSample(binding, textures, `${extensionKey}.${textureKey}`),\n };\n }\n return extensions;\n}\n\nfunction mapMaterial(material, materialRefId, textures) {\n if (!material) {\n return { materialRefId };\n }\n if (material.alphaMode === \"mask\") {\n throw new Error(\"Canonical alphaMode mask is unsupported by WavefrontMeshInput.\");\n }\n if (material.workflow !== \"metallic-roughness\" && material.workflow !== \"unlit\") {\n throw new Error(`Unsupported canonical material workflow: ${material.workflow}.`);\n }\n\n const mapped = {\n materialRefId,\n ...(material.alphaMode === \"blend\" ? { materialKind: \"transparent\" } : {}),\n baseColor: material.baseColorFactor,\n emission: material.emissiveFactor\n ? [...material.emissiveFactor, 1]\n : [0, 0, 0, 1],\n roughness: material.roughnessFactor,\n metallic: material.metallicFactor,\n opacity: material.alphaMode === \"opaque\" ? 1 : material.baseColorFactor?.[3],\n clearcoat: material.clearcoatFactor,\n clearcoatRoughness: material.clearcoatRoughnessFactor,\n transmission: material.transmissionFactor,\n sheenColor: material.sheenColorFactor,\n extensions: cloneMaterialExtensions(material, textures),\n };\n\n for (const [bindingName, inputName] of STANDARD_TEXTURE_BINDINGS) {\n const binding = material.textures?.[bindingName];\n if (!binding) {\n continue;\n }\n const extra = bindingName === \"normal\" && material.normalScale !== undefined\n ? { scale: material.normalScale }\n : bindingName === \"occlusion\" && material.occlusionStrength !== undefined\n ? { strength: material.occlusionStrength }\n : {};\n mapped[inputName] = textureSample(binding, textures, inputName, extra);\n }\n\n return mapped;\n}\n\n/**\n * Maps decoded canonical mesh primitives into the renderer's existing Wavefront\n * input contract. Geometry and image decoding remain upstream responsibilities.\n */\nexport function createCanonicalWavefrontMeshInputs({ document, geometry, textures = new Map() } = {}) {\n if (!document || typeof document !== \"object\") {\n throw new TypeError(\"Canonical model document is required.\");\n }\n const meshes = requireArray(document.meshes, \"Canonical model meshes\");\n const materials = requireArray(document.materials, \"Canonical model materials\");\n const geometryInputs = requireArray(geometry, \"Renderer-ready geometry\");\n const textureSamples = requireMap(textures, \"Decoded texture samples\");\n\n const geometryByPrimitiveId = new Map();\n for (const entry of geometryInputs) {\n if (!entry || typeof entry.primitiveId !== \"string\" || entry.primitiveId.length === 0) {\n throw new TypeError(\"Renderer-ready geometry requires a non-empty primitiveId.\");\n }\n if (geometryByPrimitiveId.has(entry.primitiveId)) {\n throw new Error(`Duplicate renderer-ready geometry for primitive ${entry.primitiveId}.`);\n }\n geometryByPrimitiveId.set(entry.primitiveId, entry);\n }\n\n const materialsById = new Map();\n const materialRefIds = new Map();\n materials.forEach((material, index) => {\n if (!material || typeof material.id !== \"string\" || material.id.length === 0) {\n throw new TypeError(\"Canonical materials require a non-empty id.\");\n }\n if (materialsById.has(material.id)) {\n throw new Error(`Duplicate canonical material ${material.id}.`);\n }\n materialsById.set(material.id, material);\n materialRefIds.set(material.id, index + 1);\n });\n\n const output = [];\n const consumedPrimitiveIds = new Set();\n const canonicalPrimitiveIds = new Set();\n for (const mesh of meshes) {\n if (!mesh || typeof mesh.id !== \"string\") {\n throw new TypeError(\"Canonical meshes require a string id.\");\n }\n for (const primitive of requireArray(mesh.primitives, `Primitives for mesh ${mesh.id}`)) {\n if (!primitive || typeof primitive.id !== \"string\" || primitive.id.length === 0) {\n throw new TypeError(`Canonical mesh ${mesh.id} contains a primitive without an id.`);\n }\n if (canonicalPrimitiveIds.has(primitive.id)) {\n throw new Error(`Duplicate canonical primitive ${primitive.id}.`);\n }\n canonicalPrimitiveIds.add(primitive.id);\n if (primitive.topology !== \"triangles\") {\n throw new Error(`Unsupported canonical primitive topology: ${primitive.topology}.`);\n }\n const source = geometryByPrimitiveId.get(primitive.id);\n if (!source) {\n throw new Error(`Missing renderer-ready geometry for primitive ${primitive.id}.`);\n }\n consumedPrimitiveIds.add(primitive.id);\n\n let material = null;\n let materialRefId = 0;\n if (primitive.materialId !== undefined) {\n material = materialsById.get(primitive.materialId);\n if (!material) {\n throw new Error(`Missing canonical material ${primitive.materialId} for primitive ${primitive.id}.`);\n }\n materialRefId = materialRefIds.get(primitive.materialId);\n }\n\n output.push(Object.freeze({\n id: output.length + 1,\n positions: source.positions,\n ...(source.indices === undefined ? {} : { indices: source.indices }),\n ...(source.normals === undefined ? {} : { normals: source.normals }),\n ...((source.texcoords ?? source.uvs) === undefined\n ? {}\n : { uvs: source.texcoords ?? source.uvs }),\n ...mapMaterial(material, materialRefId, textureSamples),\n }));\n }\n }\n\n for (const primitiveId of geometryByPrimitiveId.keys()) {\n if (!consumedPrimitiveIds.has(primitiveId)) {\n throw new Error(`Renderer-ready geometry references unknown primitive ${primitiveId}.`);\n }\n }\n\n return Object.freeze(output);\n}\n","import { resolveCameraRigFrame } from \"@plasius/gpu-camera\";\nimport { createAnimatedGltfModel } from \"./animated-gltf-model.js\";\n\nconst DEFAULT_CAMERA = Object.freeze({\n mode: \"lagged-follow\",\n viewMode: \"spectator\",\n cubicBezier: [0.22, 0.61, 0.36, 1],\n lagMs: 240,\n lookAheadMs: 320,\n offset: [0, 2.4, 5.5],\n constraints: Object.freeze({\n maxDistance: 10,\n firstPersonHeadOffset: 0.05,\n }),\n headLook: Object.freeze({\n enabled: true,\n returnMs: 240,\n }),\n});\n\nfunction nowMs() {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerp3(a, b, t) {\n return [\n lerp(a[0] ?? 0, b[0] ?? 0, t),\n lerp(a[1] ?? 0, b[1] ?? 0, t),\n lerp(a[2] ?? 0, b[2] ?? 0, t),\n ];\n}\n\nfunction normalize3(value, fallback = [0, 0, -1]) {\n if (!Array.isArray(value) || value.length < 3) {\n return [...fallback];\n }\n const vector = [\n Number.isFinite(Number(value[0])) ? Number(value[0]) : fallback[0],\n Number.isFinite(Number(value[1])) ? Number(value[1]) : fallback[1],\n Number.isFinite(Number(value[2])) ? Number(value[2]) : fallback[2],\n ];\n const length = Math.hypot(vector[0], vector[1], vector[2]);\n if (length <= 1e-6) {\n return [...fallback];\n }\n return [vector[0] / length, vector[1] / length, vector[2] / length];\n}\n\nfunction clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction bezierY([, y1, , y2], t) {\n const u = 1 - t;\n return 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t;\n}\n\nfunction durationFromBeats(beats) {\n return beats.reduce((total, beat) => total + Math.max(0, beat.durationMs ?? 0), 0);\n}\n\nfunction definedCameraOverrides(camera) {\n if (!camera || typeof camera !== \"object\") {\n return {};\n }\n return Object.fromEntries(Object.entries(camera).filter(([, value]) => value !== undefined));\n}\n\nfunction resolveBeat(beats, loopTimeMs) {\n let cursor = 0;\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n if (loopTimeMs < cursor + durationMs) {\n return { beat, beatTimeMs: loopTimeMs - cursor, durationMs };\n }\n cursor += durationMs;\n }\n const fallback = beats.at(-1);\n return { beat: fallback, beatTimeMs: fallback?.durationMs ?? 0, durationMs: fallback?.durationMs ?? 1 };\n}\n\nfunction resolveRoutePosition(route, timeMs) {\n if (!route.length) {\n return [0, 0, 0];\n }\n if (route.length === 1 || timeMs <= (route[0].arriveMs ?? 0)) {\n return [...route[0].position];\n }\n\n for (let index = 1; index < route.length; index += 1) {\n const previous = route[index - 1];\n const next = route[index];\n const start = previous.arriveMs ?? 0;\n const end = next.arriveMs ?? start + 1;\n if (timeMs <= end) {\n return lerp3(previous.position, next.position, clamp01((timeMs - start) / Math.max(1, end - start)));\n }\n }\n\n return [...route.at(-1).position];\n}\n\nfunction resolveRouteForward(route, timeMs) {\n if (route.length < 2) {\n return [0, 0, -1];\n }\n let previous = route[0];\n let next = route[1];\n for (let index = 1; index < route.length; index += 1) {\n next = route[index];\n if (timeMs <= (next.arriveMs ?? 0)) {\n previous = route[index - 1];\n break;\n }\n }\n return normalize3([\n (next.position?.[0] ?? 0) - (previous.position?.[0] ?? 0),\n (next.position?.[1] ?? 0) - (previous.position?.[1] ?? 0),\n (next.position?.[2] ?? 0) - (previous.position?.[2] ?? 0),\n ]);\n}\n\nfunction distance3(a = [0, 0, 0], b = [0, 0, 0]) {\n return Math.hypot(\n (b[0] ?? 0) - (a[0] ?? 0),\n (b[1] ?? 0) - (a[1] ?? 0),\n (b[2] ?? 0) - (a[2] ?? 0),\n );\n}\n\nfunction movementRequirementType(requirement, beat) {\n if (requirement?.type) {\n return requirement.type;\n }\n if (beat?.kind === \"locomotion\") {\n return beat?.rootMotion === \"in-place\" ? \"stationary\" : \"travel\";\n }\n if (beat?.kind === \"action\" || beat?.kind === \"idle\") {\n return \"stationary\";\n }\n const clipId = String(beat?.clipId ?? \"\").toLowerCase();\n if (/(idle|gesture|dig|plant|water|pick|serve|swing|fire|block|hoe)/iu.test(clipId)) {\n return \"stationary\";\n }\n if (/(walk|run|jump|climb|crawl|locomotion)/iu.test(clipId)) {\n return clipId.includes(\"jump\") ? \"jump\" : \"travel\";\n }\n return beat?.pathPointId ? \"travel\" : \"stationary\";\n}\n\nfunction movementDistancePerLoop(profile = {}) {\n profile ??= {};\n const rootDistance = Number(profile.rootTranslationDistance ?? profile.rootTranslation?.distance ?? 0);\n if (Number.isFinite(rootDistance) && rootDistance > 0) {\n return rootDistance;\n }\n const strideLength = Number(profile.strideLength ?? profile.strideLengthMeters ?? 0);\n if (Number.isFinite(strideLength) && strideLength > 0) {\n return strideLength;\n }\n return 0;\n}\n\nfunction clipDurationMs(profile = {}, fallbackMs = 1) {\n profile ??= {};\n const duration = Number(profile.durationMs ?? 0);\n return Number.isFinite(duration) && duration > 0 ? duration : Math.max(1, fallbackMs);\n}\n\nfunction profileAllowsDisplacement(profile = {}, movementType) {\n profile ??= {};\n if (movementType === \"stationary\") {\n return profile.worldDisplacementAllowed !== true;\n }\n return profile.worldDisplacementAllowed === true\n || profile.motionMode === \"root-authored\"\n || profile.motionMode === \"calibrated-in-place\"\n || profile.motionMode === \"jump\";\n}\n\nfunction resolveClipProfiles(clipAssets = []) {\n return new Map(clipAssets.map((clip) => [clip.id, clip.movementProfile ?? clip.profile ?? null]));\n}\n\nfunction buildBeatTimeline(beats, route, clipProfiles) {\n const routePoints = new Map(route.map((point) => [point.id, point]));\n let cursorMs = 0;\n let routeCursor = 0;\n let currentPosition = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n return beats.map((beat) => {\n const requirement = beat.movementRequirement ?? beat.movement ?? null;\n const movementType = movementRequirementType(requirement, beat);\n const movesThroughWorld = movementType === \"travel\" || movementType === \"jump\" || movementType === \"root-authored\";\n const explicitTargetPoint = beat.pathPointId ? routePoints.get(beat.pathPointId) : null;\n const inferredTargetPoint = movesThroughWorld ? route[Math.min(route.length - 1, routeCursor + 1)] : null;\n const targetPoint = explicitTargetPoint ?? inferredTargetPoint ?? null;\n const targetPosition = targetPoint?.position ? [...targetPoint.position] : [...currentPosition];\n const startPosition = [...currentPosition];\n const endPosition = movesThroughWorld ? targetPosition : [...currentPosition];\n const segmentDistance = Number(requirement?.distance ?? distance3(startPosition, endPosition));\n const profile = clipProfiles.get(beat.clipId) ?? null;\n const distancePerLoop = movementDistancePerLoop(profile);\n const loopCount = movesThroughWorld && distancePerLoop > 0\n ? Math.max(1, Math.ceil(segmentDistance / distancePerLoop))\n : 1;\n const derivedDurationMs = movesThroughWorld && distancePerLoop > 0\n ? loopCount * clipDurationMs(profile, beat.durationMs)\n : Math.max(1, beat.durationMs ?? 1);\n const durationMs = Math.max(1, beat.validatedDurationMs ?? requirement?.validatedDurationMs ?? derivedDurationMs);\n const expectedSpeed = Number(profile?.expectedSpeed ?? (durationMs > 0 ? segmentDistance / (durationMs / 1000) : 0));\n const actualSpeed = durationMs > 0 ? segmentDistance / (durationMs / 1000) : 0;\n const warnings = [];\n\n if (movesThroughWorld && !profileAllowsDisplacement(profile, movementType)) {\n warnings.push(`clip '${beat.clipId}' does not allow ${movementType} displacement`);\n }\n if (movesThroughWorld && distancePerLoop <= 0 && profile?.motionMode !== \"root-authored\") {\n warnings.push(`clip '${beat.clipId}' has no root or calibrated stride distance`);\n }\n if (movementType === \"stationary\" && profile?.worldDisplacementAllowed === true) {\n warnings.push(`stationary beat '${beat.id}' uses a displacement-capable clip`);\n }\n\n const entry = {\n beat,\n startMs: cursorMs,\n endMs: cursorMs + durationMs,\n durationMs,\n startPosition,\n endPosition,\n movementType,\n movementProfile: profile,\n movementDistance: segmentDistance,\n distancePerLoop,\n loopCount,\n expectedSpeed,\n actualSpeed,\n footSlideWarning: Number(profile?.footSlideTolerance ?? 0) < 0 ? \"invalid-foot-slide-tolerance\" : null,\n warnings,\n };\n\n cursorMs = entry.endMs;\n currentPosition = [...endPosition];\n if (targetPoint) {\n const nextRouteIndex = route.findIndex((point) => point.id === targetPoint.id);\n if (nextRouteIndex >= 0) {\n routeCursor = nextRouteIndex;\n }\n }\n return entry;\n });\n}\n\nfunction resolveTimelineBeat(timeline, loopTimeMs) {\n if (!timeline.length) {\n return null;\n }\n return timeline.find((entry) => loopTimeMs < entry.endMs) ?? timeline.at(-1);\n}\n\nfunction resolveTimelinePosition(entry, beatTimeMs) {\n if (!entry) {\n return [0, 0, 0];\n }\n if (entry.movementType !== \"travel\" && entry.movementType !== \"jump\" && entry.movementType !== \"root-authored\") {\n return [...entry.startPosition];\n }\n return lerp3(entry.startPosition, entry.endPosition, clamp01(beatTimeMs / Math.max(1, entry.durationMs)));\n}\n\nfunction resolveTimelineForward(entry) {\n if (!entry) {\n return [0, 0, -1];\n }\n return normalize3([\n (entry.endPosition[0] ?? 0) - (entry.startPosition[0] ?? 0),\n (entry.endPosition[1] ?? 0) - (entry.startPosition[1] ?? 0),\n (entry.endPosition[2] ?? 0) - (entry.startPosition[2] ?? 0),\n ]);\n}\n\nfunction resolveCameraViewMode(camera) {\n if (camera?.mode === \"lagged-follow\") {\n return camera.viewMode ?? \"spectator\";\n }\n return camera?.viewMode ?? camera?.mode ?? \"spectator\";\n}\n\nfunction resolveCanvas(canvas) {\n if (typeof canvas === \"string\") {\n const found = globalThis.document?.querySelector?.(canvas);\n if (!found) {\n throw new Error(`Animated scene canvas '${canvas}' was not found.`);\n }\n return found;\n }\n if (!canvas) {\n throw new Error(\"Animated scene renderer requires a canvas.\");\n }\n return canvas;\n}\n\nfunction project(position, cameraPosition, width, height) {\n const x = position[0] - cameraPosition[0];\n const depth = Math.max(0.2, cameraPosition[2] - (position[2] ?? 0));\n const scale = clamp(34 + 150 / (depth + 1.2), 34, 104);\n const groundY = height * 0.82 - depth * height * 0.045 - (position[1] ?? 0) * scale;\n return {\n x: width * 0.5 + x * scale,\n y: groundY,\n groundY,\n scale,\n depth,\n visible: groundY > -height * 0.2 && groundY < height * 1.18,\n };\n}\n\nfunction propIdentity(prop, index) {\n return prop.id ?? `${prop.kind}-${index}`;\n}\n\nfunction drawGroundShadow(ctx, scale) {\n ctx.fillStyle = \"rgba(44, 38, 28, 0.18)\";\n ctx.fillRect(-scale * 0.36, -scale * 0.035, scale * 0.72, scale * 0.07);\n}\n\nfunction drawProp(ctx, prop, cameraPosition, width, height) {\n const projected = project(prop.position, cameraPosition, width, height);\n const { x, y, scale } = projected;\n ctx.save();\n ctx.translate(x, y);\n ctx.lineWidth = Math.max(1, scale * 0.04);\n\n if (prop.kind === \"crop-row\") {\n ctx.fillStyle = \"#8b633f\";\n ctx.fillRect(-scale * 1.05, -scale * 0.08, scale * 2.1, scale * 0.16);\n ctx.fillStyle = \"#6f4a30\";\n ctx.fillRect(-scale * 0.92, -scale * 0.035, scale * 1.84, scale * 0.07);\n ctx.strokeStyle = \"#4f6f32\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.8, 0);\n ctx.lineTo(scale * 0.8, 0);\n ctx.stroke();\n ctx.fillStyle = \"#6f9f43\";\n for (let i = -3; i <= 3; i += 1) {\n ctx.fillRect(i * scale * 0.22, -scale * 0.18, scale * 0.06, scale * 0.2);\n }\n } else if (prop.kind === \"fence-segment\") {\n ctx.strokeStyle = \"#896b4d\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.5, 0);\n ctx.lineTo(scale * 0.5, 0);\n ctx.moveTo(-scale * 0.35, -scale * 0.25);\n ctx.lineTo(-scale * 0.35, scale * 0.1);\n ctx.moveTo(scale * 0.35, -scale * 0.25);\n ctx.lineTo(scale * 0.35, scale * 0.1);\n ctx.stroke();\n } else if (prop.kind === \"cart\") {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = \"#7b5238\";\n ctx.fillRect(-scale * 0.52, -scale * 0.38, scale * 1.04, scale * 0.36);\n ctx.fillStyle = \"#a4774c\";\n ctx.fillRect(-scale * 0.44, -scale * 0.32, scale * 0.88, scale * 0.08);\n ctx.fillStyle = \"#25201c\";\n ctx.beginPath();\n ctx.arc(-scale * 0.32, scale * 0.02, scale * 0.1, 0, Math.PI * 2);\n ctx.arc(scale * 0.32, scale * 0.02, scale * 0.1, 0, Math.PI * 2);\n ctx.fill();\n } else if (prop.kind === \"small-tree\") {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = \"#5b3b24\";\n ctx.fillRect(-scale * 0.07, -scale * 0.56, scale * 0.14, scale * 0.56);\n ctx.fillStyle = \"#2f6d3b\";\n ctx.beginPath();\n ctx.arc(-scale * 0.16, -scale * 0.72, scale * 0.25, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#3f8746\";\n ctx.beginPath();\n ctx.arc(scale * 0.13, -scale * 0.76, scale * 0.28, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#4f9a50\";\n ctx.beginPath();\n ctx.arc(0, -scale * 0.98, scale * 0.26, 0, Math.PI * 2);\n ctx.fill();\n } else {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = prop.kind === \"crate\" ? \"#9a6a3d\" : \"#d0c39f\";\n ctx.fillRect(-scale * 0.2, -scale * 0.32, scale * 0.4, scale * 0.32);\n if (prop.kind === \"crate\") {\n ctx.strokeStyle = \"#6e4829\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.2, -scale * 0.16);\n ctx.lineTo(scale * 0.2, -scale * 0.16);\n ctx.moveTo(0, -scale * 0.32);\n ctx.lineTo(0, 0);\n ctx.stroke();\n }\n }\n\n ctx.restore();\n return projected;\n}\n\nfunction drawCharacter(ctx, characterPosition, cameraPosition, width, height, gaitPhase, headLook) {\n const projected = project(characterPosition, cameraPosition, width, height);\n const { x, y, scale } = projected;\n const stride = Math.sin(gaitPhase * Math.PI * 2);\n const headYaw = (headLook?.yaw ?? 0) * (headLook?.weight ?? 0);\n ctx.save();\n ctx.translate(x, y);\n ctx.lineWidth = Math.max(2, scale * 0.05);\n ctx.lineCap = \"round\";\n\n drawGroundShadow(ctx, scale);\n\n ctx.strokeStyle = \"#4c2f25\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.12, -scale * 0.34);\n ctx.lineTo(-scale * (0.18 + stride * 0.04), -scale * 0.02);\n ctx.moveTo(scale * 0.12, -scale * 0.34);\n ctx.lineTo(scale * (0.18 - stride * 0.04), -scale * 0.02);\n ctx.stroke();\n\n ctx.fillStyle = \"#6f8f62\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.3, -scale * 0.86);\n ctx.lineTo(scale * 0.3, -scale * 0.86);\n ctx.lineTo(scale * 0.42, -scale * 0.24);\n ctx.lineTo(-scale * 0.42, -scale * 0.24);\n ctx.lineTo(-scale * 0.3, -scale * 0.86);\n ctx.fill();\n\n ctx.fillStyle = \"#d8b18c\";\n ctx.beginPath();\n ctx.arc(0, -scale * 1.16, scale * 0.18, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = \"#5a3a2b\";\n ctx.fillRect(-scale * 0.2, -scale * 1.28, scale * 0.4, scale * 0.16);\n ctx.fillRect(-scale * 0.23, -scale * 1.14, scale * 0.1, scale * 0.28);\n ctx.fillRect(scale * 0.13, -scale * 1.14, scale * 0.1, scale * 0.28);\n if (headLook?.status === \"active\" || headLook?.status === \"returning\") {\n ctx.strokeStyle = \"rgba(255, 246, 210, 0.74)\";\n ctx.lineWidth = Math.max(1, scale * 0.025);\n ctx.beginPath();\n ctx.moveTo(0, -scale * 1.16);\n ctx.lineTo(Math.sin(headYaw) * scale * 0.32, -scale * 1.16 - scale * 0.08);\n ctx.stroke();\n }\n\n ctx.strokeStyle = \"#6b4935\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.24, -scale * 0.76);\n ctx.lineTo(-scale * (0.46 + stride * 0.04), -scale * (0.5 + stride * 0.06));\n ctx.moveTo(scale * 0.24, -scale * 0.76);\n ctx.lineTo(scale * (0.46 - stride * 0.04), -scale * (0.5 - stride * 0.06));\n ctx.stroke();\n\n ctx.fillStyle = \"#d6c09a\";\n ctx.fillRect(-scale * 0.16, -scale * 0.86, scale * 0.32, scale * 0.18);\n ctx.restore();\n return projected;\n}\n\nfunction pointForModelVertex(vertex, projection, sample) {\n const bounds = sample.bounds;\n const height = Math.max(0.1, bounds.size[1] || sample.bindBounds.size[1] || 1);\n const modelScale = projection.scale * 1.3 / height;\n const centerX = (bounds.min[0] + bounds.max[0]) * 0.5;\n const centerZ = (bounds.min[2] + bounds.max[2]) * 0.5;\n return [\n projection.x + (vertex[0] - centerX) * modelScale,\n projection.groundY - (vertex[1] - bounds.min[1]) * modelScale + (vertex[2] - centerZ) * modelScale * 0.16,\n ];\n}\n\nfunction modelFillForHeight(vertex, sample) {\n const height = Math.max(0.1, sample.bounds.size[1] || 1);\n const t = (vertex[1] - sample.bounds.min[1]) / height;\n if (t > 0.82) {\n return \"#6d4a36\";\n }\n if (t > 0.58) {\n return \"#d7b28f\";\n }\n if (t > 0.25) {\n return \"#6f8f62\";\n }\n return \"#5e4636\";\n}\n\nfunction drawSkinnedGltfCharacter(ctx, model, snapshot, width, height) {\n const projection = project(snapshot.characterPosition, snapshot.cameraPosition, width, height);\n const sample = model.sample(snapshot.activeClipId, snapshot.clipTimeMs);\n const maxTriangles = 12000;\n const triangleCount = Math.floor(sample.indices.length / 3);\n const stride = Math.max(1, Math.ceil(triangleCount / maxTriangles));\n const triangles = [];\n for (let triangleIndex = 0; triangleIndex < triangleCount; triangleIndex += stride) {\n const base = triangleIndex * 3;\n const a = sample.vertices[sample.indices[base]];\n const b = sample.vertices[sample.indices[base + 1]];\n const c = sample.vertices[sample.indices[base + 2]];\n if (!a || !b || !c) {\n continue;\n }\n triangles.push({\n a,\n b,\n c,\n depth: (a[2] + b[2] + c[2]) / 3,\n fill: modelFillForHeight(a, sample),\n });\n }\n triangles.sort((left, right) => left.depth - right.depth);\n\n ctx.save();\n drawGroundShadow(ctx, projection.scale);\n for (const triangle of triangles) {\n const [ax, ay] = pointForModelVertex(triangle.a, projection, sample);\n const [bx, by] = pointForModelVertex(triangle.b, projection, sample);\n const [cx, cy] = pointForModelVertex(triangle.c, projection, sample);\n ctx.fillStyle = triangle.fill;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.lineTo(cx, cy);\n ctx.closePath?.();\n ctx.fill();\n }\n ctx.restore();\n\n return {\n projection,\n sample,\n };\n}\n\nfunction renderScene(canvas, ctx, snapshot, props, characterModel) {\n const width = canvas.width || 1;\n const height = canvas.height || 1;\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = \"#d8e8d0\";\n ctx.fillRect(0, 0, width, height);\n ctx.fillStyle = \"#9fc47a\";\n ctx.fillRect(0, height * 0.52, width, height * 0.48);\n ctx.strokeStyle = \"#caa66d\";\n ctx.lineWidth = Math.max(2, width * 0.006);\n ctx.beginPath();\n ctx.moveTo(width * 0.35, height);\n ctx.quadraticCurveTo(width * 0.53, height * 0.58, width * 0.62, 0);\n ctx.stroke();\n\n const projectedProps = props\n .map((prop, index) => ({\n prop,\n id: propIdentity(prop, index),\n projected: project(prop.position, snapshot.cameraPosition, width, height),\n }))\n .sort((a, b) => b.projected.depth - a.projected.depth);\n\n const propGroundAnchors = [];\n for (const { prop, id } of projectedProps) {\n const projected = drawProp(ctx, prop, snapshot.cameraPosition, width, height);\n propGroundAnchors.push({\n id,\n kind: prop.kind,\n groundY: projected.groundY,\n depth: projected.depth,\n visible: projected.visible,\n });\n }\n let characterProjection;\n let modelRenderable = false;\n let fallbackProxyActive = true;\n let skinnedVertexCount = 0;\n let skinnedTriangleCount = 0;\n let skinnedJointCount = 0;\n let skinnedAnimatedNodeCount = 0;\n let skinnedClipCount = 0;\n let activeClipRenderable = false;\n\n if (characterModel) {\n const drawn = drawSkinnedGltfCharacter(ctx, characterModel, snapshot, width, height);\n characterProjection = drawn.projection;\n modelRenderable = true;\n fallbackProxyActive = false;\n skinnedVertexCount = characterModel.vertexCount;\n skinnedTriangleCount = characterModel.triangleCount;\n skinnedJointCount = characterModel.jointCount;\n skinnedAnimatedNodeCount = characterModel.animatedNodeCount;\n skinnedClipCount = characterModel.clipCount;\n activeClipRenderable = drawn.sample.activeClipRenderable;\n } else {\n characterProjection = drawCharacter(\n ctx,\n snapshot.characterPosition,\n snapshot.cameraPosition,\n width,\n height,\n snapshot.clipTimeMs / 900,\n snapshot.headLook,\n );\n }\n\n return {\n characterGroundY: characterProjection.groundY,\n characterVisible: characterProjection.visible,\n modelLoaded: Boolean(characterModel),\n modelRenderable,\n fallbackProxyActive,\n skinnedVertexCount,\n skinnedTriangleCount,\n skinnedJointCount,\n skinnedAnimatedNodeCount,\n skinnedClipCount,\n activeClipRenderable,\n propGroundAnchors,\n };\n}\n\nfunction resolveCharacterModel(options) {\n try {\n return createAnimatedGltfModel(\n options.modelAsset ?? options.animationAdventure?.modelAsset,\n options.clipAssets ?? options.animationAdventure?.clipAssets ?? [],\n );\n } catch {\n return null;\n }\n}\n\nexport function createAnimatedSceneRenderer(options = {}) {\n const canvas = resolveCanvas(options.canvas);\n const ctx = canvas.getContext?.(\"2d\");\n if (!ctx) {\n throw new Error(\"Animated scene renderer requires a 2D canvas context.\");\n }\n\n const route = [...(options.route ?? options.animationAdventure?.route ?? [])];\n const beats = [...(options.beats ?? options.animationAdventure?.beats ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n const props = [...(options.props ?? options.animationAdventure?.props ?? [])];\n const clipAssets = options.clipAssets ?? options.animationAdventure?.clipAssets ?? [];\n const clipProfiles = resolveClipProfiles(clipAssets);\n const beatTimeline = buildBeatTimeline(beats, route, clipProfiles);\n const characterModel = resolveCharacterModel(options);\n let camera = {\n ...DEFAULT_CAMERA,\n ...definedCameraOverrides(options.camera ?? options.animationAdventure?.camera),\n };\n const loopDurationMs = Math.max(beatTimeline.at(-1)?.endMs ?? durationFromBeats(beats), 1);\n const movementWarnings = beatTimeline.flatMap((entry) => entry.warnings);\n const requestFrame = options.requestAnimationFrame ?? globalThis.requestAnimationFrame?.bind(globalThis);\n const cancelFrame = options.cancelAnimationFrame ?? globalThis.cancelAnimationFrame?.bind(globalThis);\n let frameHandle;\n let running = false;\n let frame = 0;\n let startedAtMs;\n let lastTimestamp;\n let pendingCameraControl = null;\n let activeCameraControl = false;\n let headLookWeight = 0;\n let cameraPosition = route[0]\n ? [\n route[0].position[0] + (camera.offset?.[0] ?? 0),\n route[0].position[1] + (camera.offset?.[1] ?? 0),\n route[0].position[2] + (camera.offset?.[2] ?? 0),\n ]\n : [0, 2.4, 5.5];\n let cameraRigFrame = resolveCameraRigFrame({\n viewMode: \"editor\",\n anchors: {\n target: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n head: route[0]?.position ? [route[0].position[0], route[0].position[1] + 1.65, route[0].position[2]] : [0, 1.65, 0],\n forward: [0, 0, -1],\n },\n camera: {\n id: \"animation-adventure\",\n transform: {\n position: [...cameraPosition],\n target: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n },\n },\n constraints: camera.constraints,\n });\n let snapshot = {\n frame,\n running,\n activeClipId: beats[0]?.clipId ?? \"\",\n activeBeatId: beats[0]?.id ?? \"\",\n activeMovementMode: beatTimeline[0]?.movementType ?? \"stationary\",\n blendProgress: 0,\n clipTimeMs: 0,\n characterPosition: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n cameraPosition: [...cameraPosition],\n cameraViewMode: resolveCameraViewMode(camera),\n cameraTransform: cameraRigFrame.transform,\n targetDistance: cameraRigFrame.targetDistance,\n headLook: cameraRigFrame.headLook,\n characterGroundY: 0,\n characterVisible: false,\n modelLoaded: Boolean(characterModel),\n modelRenderable: false,\n fallbackProxyActive: true,\n skinnedVertexCount: characterModel?.vertexCount ?? 0,\n skinnedTriangleCount: characterModel?.triangleCount ?? 0,\n skinnedJointCount: characterModel?.jointCount ?? 0,\n skinnedAnimatedNodeCount: characterModel?.animatedNodeCount ?? 0,\n skinnedClipCount: characterModel?.clipCount ?? 0,\n activeClipRenderable: false,\n propGroundAnchors: [],\n movementValidation: {\n status: movementWarnings.length ? \"warning\" : \"passed\",\n warnings: movementWarnings,\n activeBeatId: beats[0]?.id ?? \"\",\n activeClipId: beats[0]?.clipId ?? \"\",\n motionMode: beatTimeline[0]?.movementType ?? \"stationary\",\n rootMotionSource: beatTimeline[0]?.movementProfile?.motionMode ?? \"none\",\n expectedSpeed: beatTimeline[0]?.expectedSpeed ?? 0,\n actualSpeed: beatTimeline[0]?.actualSpeed ?? 0,\n movementDistance: beatTimeline[0]?.movementDistance ?? 0,\n loopCount: beatTimeline[0]?.loopCount ?? 1,\n footSlideWarning: beatTimeline[0]?.footSlideWarning ?? null,\n },\n frameState: \"initialized\",\n };\n\n function renderOnce(timestamp = nowMs()) {\n if (startedAtMs === undefined) {\n startedAtMs = timestamp;\n }\n const elapsedMs = Math.max(0, timestamp - startedAtMs);\n const loopTimeMs = elapsedMs % loopDurationMs;\n const frameTimeMs = lastTimestamp === undefined ? 16.67 : Math.max(0, timestamp - lastTimestamp);\n lastTimestamp = timestamp;\n frame += 1;\n\n const timelineEntry = resolveTimelineBeat(beatTimeline, loopTimeMs);\n const fallbackBeat = resolveBeat(beats, loopTimeMs);\n const beat = timelineEntry?.beat ?? fallbackBeat.beat;\n const beatTimeMs = timelineEntry ? loopTimeMs - timelineEntry.startMs : fallbackBeat.beatTimeMs;\n const durationMs = timelineEntry?.durationMs ?? fallbackBeat.durationMs;\n const blend = beat?.blend ?? { inMs: 0, outMs: 0 };\n const blendIn = blend.inMs > 0 ? clamp01(beatTimeMs / blend.inMs) : 1;\n const blendOut = blend.outMs > 0 ? clamp01((durationMs - beatTimeMs) / blend.outMs) : 1;\n const blendProgress = clamp01(Math.min(blendIn, blendOut));\n const characterPosition = timelineEntry\n ? resolveTimelinePosition(timelineEntry, beatTimeMs)\n : resolveRoutePosition(route, loopTimeMs);\n const characterForward = timelineEntry ? resolveTimelineForward(timelineEntry) : resolveRouteForward(route, loopTimeMs);\n const headAnchor =\n camera.headBoneAvailable === false\n ? undefined\n : [\n characterPosition[0],\n characterPosition[1] + (camera.headHeight ?? 1.65),\n characterPosition[2],\n ];\n const lookAheadTimeMs = (loopTimeMs + camera.lookAheadMs) % loopDurationMs;\n const lookAheadEntry = resolveTimelineBeat(beatTimeline, lookAheadTimeMs);\n const lookAheadPosition = lookAheadEntry\n ? resolveTimelinePosition(lookAheadEntry, lookAheadTimeMs - lookAheadEntry.startMs)\n : resolveRoutePosition(route, lookAheadTimeMs);\n const desiredCamera = [\n lookAheadPosition[0] + (camera.offset?.[0] ?? 0),\n lookAheadPosition[1] + (camera.offset?.[1] ?? 0),\n lookAheadPosition[2] + (camera.offset?.[2] ?? 0),\n ];\n const smoothing = bezierY(camera.cubicBezier, clamp01(frameTimeMs / Math.max(1, camera.lagMs)));\n cameraPosition = lerp3(cameraPosition, desiredCamera, smoothing);\n const cameraViewMode = resolveCameraViewMode(camera);\n const rigViewMode = cameraViewMode === \"spectator\" ? \"editor\" : cameraViewMode;\n cameraRigFrame = resolveCameraRigFrame({\n viewMode: rigViewMode,\n anchors: {\n target: characterPosition,\n ...(headAnchor ? { head: headAnchor } : {}),\n forward: characterForward,\n },\n camera: {\n id: \"animation-adventure\",\n transform: {\n position: [...cameraPosition],\n target: lookAheadPosition,\n },\n },\n constraints: camera.constraints,\n control: pendingCameraControl,\n activeControl: activeCameraControl,\n });\n\n if (activeCameraControl && cameraRigFrame.headLook.status === \"active\") {\n headLookWeight = cameraRigFrame.headLook.weight;\n } else {\n const returnMs = Math.max(1, camera.headLook?.returnMs ?? DEFAULT_CAMERA.headLook.returnMs);\n headLookWeight = lerp(headLookWeight, 0, clamp01(frameTimeMs / returnMs));\n }\n const headLook = {\n ...cameraRigFrame.headLook,\n status:\n cameraRigFrame.headLook.status === \"unavailable\"\n ? \"unavailable\"\n : headLookWeight > 0.001 && !activeCameraControl\n ? \"returning\"\n : cameraRigFrame.headLook.status,\n weight: headLookWeight,\n };\n cameraPosition = [...cameraRigFrame.transform.position];\n pendingCameraControl = null;\n activeCameraControl = false;\n\n snapshot = {\n frame,\n running,\n activeClipId: beat?.clipId ?? \"\",\n activeBeatId: beat?.id ?? \"\",\n activeMovementMode: timelineEntry?.movementType ?? \"stationary\",\n blendProgress,\n clipTimeMs: beatTimeMs,\n characterPosition,\n cameraPosition: [...cameraPosition],\n cameraViewMode,\n cameraTransform: cameraRigFrame.transform,\n targetDistance: cameraRigFrame.targetDistance,\n headLook,\n characterGroundY: 0,\n characterVisible: false,\n modelLoaded: Boolean(characterModel),\n modelRenderable: false,\n fallbackProxyActive: true,\n skinnedVertexCount: characterModel?.vertexCount ?? 0,\n skinnedTriangleCount: characterModel?.triangleCount ?? 0,\n skinnedJointCount: characterModel?.jointCount ?? 0,\n skinnedAnimatedNodeCount: characterModel?.animatedNodeCount ?? 0,\n skinnedClipCount: characterModel?.clipCount ?? 0,\n activeClipRenderable: false,\n propGroundAnchors: [],\n movementValidation: {\n status: movementWarnings.length ? \"warning\" : \"passed\",\n warnings: [...movementWarnings],\n activeBeatId: beat?.id ?? \"\",\n activeClipId: beat?.clipId ?? \"\",\n motionMode: timelineEntry?.movementType ?? \"stationary\",\n rootMotionSource: timelineEntry?.movementProfile?.motionMode ?? \"none\",\n expectedSpeed: timelineEntry?.expectedSpeed ?? 0,\n actualSpeed: timelineEntry?.actualSpeed ?? 0,\n movementDistance: timelineEntry?.movementDistance ?? 0,\n loopCount: timelineEntry?.loopCount ?? 1,\n footSlideWarning: timelineEntry?.footSlideWarning ?? null,\n },\n frameState: running ? \"running\" : \"rendered-once\",\n };\n\n const visibility = renderScene(canvas, ctx, snapshot, props, characterModel);\n snapshot = {\n ...snapshot,\n ...visibility,\n };\n return snapshot;\n }\n\n function tick(timestamp) {\n if (!running) {\n return;\n }\n renderOnce(timestamp);\n if (running && requestFrame) {\n frameHandle = requestFrame(tick);\n }\n }\n\n return {\n start() {\n if (running) {\n return;\n }\n running = true;\n snapshot = { ...snapshot, running: true, frameState: \"running\" };\n if (requestFrame) {\n frameHandle = requestFrame(tick);\n } else {\n renderOnce();\n }\n },\n resize(width, height, devicePixelRatio = 1) {\n const ratio = Number.isFinite(devicePixelRatio) && devicePixelRatio > 0 ? devicePixelRatio : 1;\n canvas.width = Math.max(1, Math.floor(width * ratio));\n canvas.height = Math.max(1, Math.floor(height * ratio));\n if (canvas.style) {\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n const visibility = renderScene(canvas, ctx, snapshot, props, characterModel);\n snapshot = {\n ...snapshot,\n ...visibility,\n };\n },\n renderOnce,\n getSnapshot() {\n return {\n ...snapshot,\n characterPosition: [...snapshot.characterPosition],\n cameraPosition: [...snapshot.cameraPosition],\n cameraTransform: {\n position: [...snapshot.cameraTransform.position],\n target: [...snapshot.cameraTransform.target],\n up: [...snapshot.cameraTransform.up],\n },\n headLook: {\n ...snapshot.headLook,\n target: [...snapshot.headLook.target],\n },\n movementValidation: {\n ...snapshot.movementValidation,\n warnings: [...(snapshot.movementValidation?.warnings ?? [])],\n },\n propGroundAnchors: snapshot.propGroundAnchors.map((anchor) => ({ ...anchor })),\n };\n },\n setCamera(nextCamera = {}) {\n camera = { ...camera, ...nextCamera };\n snapshot = {\n ...snapshot,\n cameraViewMode: resolveCameraViewMode(camera),\n };\n },\n setCameraViewMode(viewMode) {\n camera = { ...camera, viewMode };\n snapshot = {\n ...snapshot,\n cameraViewMode: resolveCameraViewMode(camera),\n };\n },\n applyCameraControl(control, options = {}) {\n pendingCameraControl = control;\n activeCameraControl = options.activeControl !== false;\n },\n destroy() {\n running = false;\n if (frameHandle !== undefined && cancelFrame) {\n cancelFrame(frameHandle);\n }\n frameHandle = undefined;\n snapshot = { ...snapshot, running: false, frameState: \"destroyed\" };\n },\n };\n}\n","const GLB_MAGIC = 0x46546c67;\nconst GLB_VERSION = 2;\nconst GLB_JSON_CHUNK = 0x4e4f534a;\nconst GLB_BIN_CHUNK = 0x004e4942;\n\nconst COMPONENT_READERS = Object.freeze({\n 5120: { size: 1, read: (view, offset) => view.getInt8(offset), normalizedDivisor: 127 },\n 5121: { size: 1, read: (view, offset) => view.getUint8(offset), normalizedDivisor: 255 },\n 5122: { size: 2, read: (view, offset) => view.getInt16(offset, true), normalizedDivisor: 32767 },\n 5123: { size: 2, read: (view, offset) => view.getUint16(offset, true), normalizedDivisor: 65535 },\n 5125: { size: 4, read: (view, offset) => view.getUint32(offset, true), normalizedDivisor: 4294967295 },\n 5126: { size: 4, read: (view, offset) => view.getFloat32(offset, true), normalizedDivisor: 1 },\n});\n\nconst ACCESSOR_COMPONENTS = Object.freeze({\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT4: 16,\n});\n\nfunction identityMatrix() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nfunction multiplyMatrix(a, b) {\n const out = new Array(16).fill(0);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n out[column * 4 + row] =\n a[0 * 4 + row] * b[column * 4 + 0]\n + a[1 * 4 + row] * b[column * 4 + 1]\n + a[2 * 4 + row] * b[column * 4 + 2]\n + a[3 * 4 + row] * b[column * 4 + 3];\n }\n }\n return out;\n}\n\nfunction transformPoint(matrix, point) {\n const [x, y, z] = point;\n return [\n matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12],\n matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13],\n matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14],\n ];\n}\n\nfunction composeMatrix(translation = [0, 0, 0], rotation = [0, 0, 0, 1], scale = [1, 1, 1]) {\n const [x, y, z, w] = normalizeQuaternion(rotation);\n const [sx, sy, sz] = scale;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n return [\n (1 - (yy + zz)) * sx,\n (xy + wz) * sx,\n (xz - wy) * sx,\n 0,\n (xy - wz) * sy,\n (1 - (xx + zz)) * sy,\n (yz + wx) * sy,\n 0,\n (xz + wy) * sz,\n (yz - wx) * sz,\n (1 - (xx + yy)) * sz,\n 0,\n translation[0] ?? 0,\n translation[1] ?? 0,\n translation[2] ?? 0,\n 1,\n ];\n}\n\nfunction normalizeQuaternion(quaternion = [0, 0, 0, 1]) {\n const length = Math.hypot(quaternion[0] ?? 0, quaternion[1] ?? 0, quaternion[2] ?? 0, quaternion[3] ?? 1) || 1;\n return [\n (quaternion[0] ?? 0) / length,\n (quaternion[1] ?? 0) / length,\n (quaternion[2] ?? 0) / length,\n (quaternion[3] ?? 1) / length,\n ];\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerpArray(a, b, t) {\n return a.map((value, index) => lerp(value, b[index] ?? value, t));\n}\n\nfunction nlerpQuaternion(a, b, t) {\n let end = b;\n const dot = a.reduce((total, value, index) => total + value * (b[index] ?? 0), 0);\n if (dot < 0) {\n end = b.map((value) => -value);\n }\n return normalizeQuaternion(lerpArray(a, end, t));\n}\n\nfunction parseGlb(buffer) {\n if (!(buffer instanceof ArrayBuffer)) {\n return null;\n }\n const view = new DataView(buffer);\n if (view.byteLength < 20 || view.getUint32(0, true) !== GLB_MAGIC || view.getUint32(4, true) !== GLB_VERSION) {\n return null;\n }\n\n let offset = 12;\n let json = null;\n let binary = null;\n while (offset + 8 <= view.byteLength) {\n const length = view.getUint32(offset, true);\n const type = view.getUint32(offset + 4, true);\n const start = offset + 8;\n const end = start + length;\n if (end > view.byteLength) {\n return null;\n }\n if (type === GLB_JSON_CHUNK) {\n const text = new TextDecoder().decode(new Uint8Array(buffer, start, length)).trim();\n json = JSON.parse(text);\n } else if (type === GLB_BIN_CHUNK) {\n binary = new Uint8Array(buffer, start, length);\n }\n offset = end;\n }\n\n if (!json || !binary) {\n return null;\n }\n return { json, binary };\n}\n\nfunction readAccessor(document, accessorIndex) {\n const accessor = document.json.accessors?.[accessorIndex];\n if (!accessor) {\n return [];\n }\n const bufferView = document.json.bufferViews?.[accessor.bufferView];\n const component = COMPONENT_READERS[accessor.componentType];\n const componentCount = ACCESSOR_COMPONENTS[accessor.type] ?? 1;\n if (!bufferView || !component) {\n return [];\n }\n\n const view = new DataView(\n document.binary.buffer,\n document.binary.byteOffset + (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0),\n bufferView.byteLength ?? 0,\n );\n const stride = bufferView.byteStride ?? component.size * componentCount;\n const values = [];\n for (let index = 0; index < accessor.count; index += 1) {\n const item = [];\n const baseOffset = index * stride;\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex += 1) {\n const raw = component.read(view, baseOffset + componentIndex * component.size);\n item.push(accessor.normalized && accessor.componentType !== 5126 ? raw / component.normalizedDivisor : raw);\n }\n values.push(componentCount === 1 ? item[0] : item);\n }\n return values;\n}\n\nfunction readMatrices(document, accessorIndex) {\n return readAccessor(document, accessorIndex).map((matrix) => Array.from(matrix));\n}\n\nfunction textureImage(document, textureIndex) {\n if (typeof textureIndex !== \"number\") {\n return null;\n }\n const texture = document.json.textures?.[textureIndex];\n return typeof texture?.source === \"number\" ? document.json.images?.[texture.source] ?? null : null;\n}\n\nfunction imageHasBuffer(document, image) {\n if (!image) {\n return false;\n }\n if (typeof image.uri === \"string\" && image.uri.trim().length > 0) {\n return true;\n }\n return typeof image.bufferView === \"number\" && Boolean(document.json.bufferViews?.[image.bufferView]);\n}\n\nfunction extractMaterialTextureMetadata(document, primitive) {\n const material = document.json.materials?.[primitive?.material];\n const baseColorTextureIndex = material?.pbrMetallicRoughness?.baseColorTexture?.index;\n const normalTextureIndex = material?.normalTexture?.index;\n const missingTextureReferences = [];\n if (typeof baseColorTextureIndex === \"number\" && !imageHasBuffer(document, textureImage(document, baseColorTextureIndex))) {\n missingTextureReferences.push(\"baseColorTexture\");\n }\n if (typeof normalTextureIndex === \"number\" && !imageHasBuffer(document, textureImage(document, normalTextureIndex))) {\n missingTextureReferences.push(\"normalTexture\");\n }\n\n return Object.freeze({\n materialCount: document.json.materials?.length ?? 0,\n textureCount: document.json.textures?.length ?? 0,\n imageCount: document.json.images?.length ?? 0,\n embeddedImageCount: (document.json.images ?? []).filter((image) => typeof image.bufferView === \"number\").length,\n baseColorTextureCount: typeof baseColorTextureIndex === \"number\" ? 1 : 0,\n normalTextureCount: typeof normalTextureIndex === \"number\" ? 1 : 0,\n hasBaseColorTexture: typeof baseColorTextureIndex === \"number\",\n hasNormalTexture: typeof normalTextureIndex === \"number\",\n missingTextureReferences: Object.freeze(missingTextureReferences),\n materialName: material?.name ?? \"\",\n });\n}\n\nfunction nodeLocalMatrix(node, override = {}) {\n if (node.matrix && !override.translation && !override.rotation && !override.scale) {\n return [...node.matrix];\n }\n return composeMatrix(\n override.translation ?? node.translation ?? [0, 0, 0],\n override.rotation ?? node.rotation ?? [0, 0, 0, 1],\n override.scale ?? node.scale ?? [1, 1, 1],\n );\n}\n\nfunction computeWorldMatrices(nodes, overridesByName = new Map()) {\n const parents = new Set();\n for (const node of nodes) {\n for (const child of node.children ?? []) {\n parents.add(child);\n }\n }\n const roots = nodes\n .map((_, index) => index)\n .filter((index) => !parents.has(index));\n const worldMatrices = nodes.map(() => identityMatrix());\n\n function visit(nodeIndex, parentMatrix) {\n const node = nodes[nodeIndex];\n if (!node) {\n return;\n }\n const worldMatrix = multiplyMatrix(parentMatrix, nodeLocalMatrix(node, overridesByName.get(node.name) ?? {}));\n worldMatrices[nodeIndex] = worldMatrix;\n for (const child of node.children ?? []) {\n visit(child, worldMatrix);\n }\n }\n\n for (const root of roots) {\n visit(root, identityMatrix());\n }\n return worldMatrices;\n}\n\nfunction normalizeWeights(weights) {\n const total = weights.reduce((sum, value) => sum + Math.max(0, value), 0);\n if (total <= 0) {\n return [1, 0, 0, 0];\n }\n return weights.map((value) => Math.max(0, value) / total);\n}\n\nfunction deriveBounds(vertices) {\n const min = [Infinity, Infinity, Infinity];\n const max = [-Infinity, -Infinity, -Infinity];\n for (const vertex of vertices) {\n for (let axis = 0; axis < 3; axis += 1) {\n min[axis] = Math.min(min[axis], vertex[axis]);\n max[axis] = Math.max(max[axis], vertex[axis]);\n }\n }\n if (!Number.isFinite(min[0])) {\n return { min: [0, 0, 0], max: [0, 1, 0], size: [1, 1, 1] };\n }\n return {\n min,\n max,\n size: [max[0] - min[0], max[1] - min[1], max[2] - min[2]],\n };\n}\n\nfunction sampleChannel(channel, sampler, document, timeSeconds) {\n const input = readAccessor(document, sampler.input);\n const output = readAccessor(document, sampler.output);\n if (!input.length || !output.length) {\n return null;\n }\n const duration = input.at(-1) || 0;\n const sampleTime = duration > 0 ? timeSeconds % duration : 0;\n let frame = 0;\n while (frame < input.length - 2 && sampleTime > input[frame + 1]) {\n frame += 1;\n }\n const start = input[frame] ?? 0;\n const end = input[frame + 1] ?? start;\n const t = end > start ? (sampleTime - start) / (end - start) : 0;\n const startValue = Array.isArray(output[frame]) ? output[frame] : [output[frame] ?? 0];\n const endValue = Array.isArray(output[frame + 1]) ? output[frame + 1] : startValue;\n return channel.target.path === \"rotation\"\n ? nlerpQuaternion(startValue, endValue, t)\n : lerpArray(startValue, endValue, t);\n}\n\nfunction rootTranslationDistance(clipPayload) {\n if (!clipPayload) {\n return 0;\n }\n let distance = 0;\n for (const channel of clipPayload.animation.channels ?? []) {\n if (channel.target?.path !== \"translation\") {\n continue;\n }\n const nodeName = clipPayload.document.json.nodes?.[channel.target.node]?.name ?? \"\";\n if (!/(^|:)Hips$/u.test(nodeName) && nodeName !== \"mixamorigHips\") {\n continue;\n }\n const sampler = clipPayload.animation.samplers?.[channel.sampler];\n const output = sampler ? readAccessor(clipPayload.document, sampler.output) : [];\n if (output.length < 2) {\n continue;\n }\n const start = Array.isArray(output[0]) ? output[0] : [0, 0, 0];\n const end = Array.isArray(output.at(-1)) ? output.at(-1) : start;\n distance = Math.max(distance, Math.hypot((end[0] ?? 0) - (start[0] ?? 0), (end[2] ?? 0) - (start[2] ?? 0)));\n }\n return distance;\n}\n\nfunction createClipPayload(clipRef) {\n const document = parseGlb(clipRef?.asset);\n const animation = document?.json.animations?.[0];\n if (!document || !animation) {\n return null;\n }\n const nodeNames = new Set();\n let durationSeconds = 0;\n for (const channel of animation.channels ?? []) {\n const nodeName = document.json.nodes?.[channel.target?.node]?.name;\n if (nodeName) {\n nodeNames.add(nodeName);\n }\n const sampler = animation.samplers?.[channel.sampler];\n const input = sampler ? readAccessor(document, sampler.input) : [];\n durationSeconds = Math.max(durationSeconds, input.at(-1) ?? 0);\n }\n return {\n id: clipRef.id,\n document,\n animation,\n durationSeconds,\n nodeNames,\n };\n}\n\nfunction sampleClipOverrides(clipPayload, timeSeconds) {\n const overrides = new Map();\n if (!clipPayload) {\n return overrides;\n }\n for (const channel of clipPayload.animation.channels ?? []) {\n const targetNode = clipPayload.document.json.nodes?.[channel.target?.node];\n const sampler = clipPayload.animation.samplers?.[channel.sampler];\n if (!targetNode?.name || !sampler) {\n continue;\n }\n const value = sampleChannel(channel, sampler, clipPayload.document, timeSeconds);\n if (!value) {\n continue;\n }\n const existing = overrides.get(targetNode.name) ?? {};\n overrides.set(targetNode.name, {\n ...existing,\n [channel.target.path]: value,\n });\n }\n return overrides;\n}\n\nexport function createAnimatedGltfModel(modelAsset, clipRefs = []) {\n const document = parseGlb(modelAsset);\n if (!document) {\n return null;\n }\n\n const nodes = document.json.nodes ?? [];\n const meshNodeIndex = nodes.findIndex((node) => node.mesh !== undefined && node.skin !== undefined);\n const meshNode = nodes[meshNodeIndex];\n const mesh = document.json.meshes?.[meshNode?.mesh];\n const primitive = mesh?.primitives?.find((candidate) => candidate.attributes?.POSITION !== undefined);\n const skin = document.json.skins?.[meshNode?.skin];\n if (!meshNode || !primitive || !skin) {\n return null;\n }\n\n const positions = readAccessor(document, primitive.attributes.POSITION);\n const normals = primitive.attributes.NORMAL === undefined\n ? []\n : readAccessor(document, primitive.attributes.NORMAL);\n const texcoords = primitive.attributes.TEXCOORD_0 === undefined\n ? []\n : readAccessor(document, primitive.attributes.TEXCOORD_0);\n const joints = primitive.attributes.JOINTS_0 === undefined\n ? positions.map(() => [0, 0, 0, 0])\n : readAccessor(document, primitive.attributes.JOINTS_0);\n const weights = primitive.attributes.WEIGHTS_0 === undefined\n ? positions.map(() => [1, 0, 0, 0])\n : readAccessor(document, primitive.attributes.WEIGHTS_0).map(normalizeWeights);\n const indices = primitive.indices === undefined\n ? positions.map((_, index) => index)\n : readAccessor(document, primitive.indices);\n const inverseBindMatrices = skin.inverseBindMatrices === undefined\n ? skin.joints.map(() => identityMatrix())\n : readMatrices(document, skin.inverseBindMatrices);\n const clips = clipRefs.map(createClipPayload).filter(Boolean);\n const bindWorldMatrices = computeWorldMatrices(nodes);\n const bindVertices = skinVertices({\n positions,\n joints,\n weights,\n skin,\n inverseBindMatrices,\n worldMatrices: bindWorldMatrices,\n });\n const bounds = deriveBounds(bindVertices);\n const materialTextureMetadata = extractMaterialTextureMetadata(document, primitive);\n const clipRootMotionDistances = new Map(clips.map((clip) => [clip.id, rootTranslationDistance(clip)]));\n\n return {\n name: mesh.name ?? meshNode.name ?? \"skinned-gltf-model\",\n vertexCount: positions.length,\n triangleCount: Math.floor(indices.length / 3),\n jointCount: skin.joints.length,\n animatedNodeCount: new Set(clips.flatMap((clip) => [...clip.nodeNames])).size,\n clipCount: clips.length,\n materialTextureMetadata,\n textureCount: materialTextureMetadata.textureCount,\n materialCount: materialTextureMetadata.materialCount,\n hasBaseColorTexture: materialTextureMetadata.hasBaseColorTexture,\n hasNormalTexture: materialTextureMetadata.hasNormalTexture,\n hasUv: texcoords.length === positions.length,\n hasNormals: normals.length === positions.length,\n professionalRenderable:\n materialTextureMetadata.hasBaseColorTexture\n && materialTextureMetadata.hasNormalTexture\n && materialTextureMetadata.missingTextureReferences.length === 0\n && texcoords.length === positions.length\n && normals.length === positions.length\n && skin.joints.length > 0,\n clips,\n sample(activeClipId, clipTimeMs) {\n const clip = clips.find((candidate) => candidate.id === activeClipId) ?? clips[0] ?? null;\n const overrides = sampleClipOverrides(clip, Math.max(0, clipTimeMs) / 1000);\n const worldMatrices = computeWorldMatrices(nodes, overrides);\n const vertices = skinVertices({\n positions,\n joints,\n weights,\n skin,\n inverseBindMatrices,\n worldMatrices,\n });\n return {\n vertices,\n indices,\n bounds: deriveBounds(vertices),\n bindBounds: bounds,\n activeClipRenderable: Boolean(clip),\n activeClipDurationSeconds: clip?.durationSeconds ?? 0,\n activeClipRootTranslationDistance: clipRootMotionDistances.get(clip?.id) ?? 0,\n };\n },\n };\n}\n\nfunction skinVertices({ positions, joints, weights, skin, inverseBindMatrices, worldMatrices }) {\n return positions.map((position, vertexIndex) => {\n const jointIndices = joints[vertexIndex] ?? [0, 0, 0, 0];\n const jointWeights = weights[vertexIndex] ?? [1, 0, 0, 0];\n const skinned = [0, 0, 0];\n for (let influence = 0; influence < 4; influence += 1) {\n const weight = jointWeights[influence] ?? 0;\n if (weight <= 0) {\n continue;\n }\n const jointNodeIndex = skin.joints[jointIndices[influence] ?? 0] ?? skin.joints[0];\n const jointMatrix = multiplyMatrix(worldMatrices[jointNodeIndex] ?? identityMatrix(), inverseBindMatrices[jointIndices[influence] ?? 0] ?? identityMatrix());\n const transformed = transformPoint(jointMatrix, position);\n skinned[0] += transformed[0] * weight;\n skinned[1] += transformed[1] * weight;\n skinned[2] += transformed[2] * weight;\n }\n return skinned;\n });\n}\n","import { createAnimatedGltfModel } from \"./animated-gltf-model.js\";\nimport { createGpuRenderer } from \"./renderer-webgpu-runtime.js\";\n\nfunction nowMs() {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerp3(a, b, t) {\n return [\n lerp(a[0] ?? 0, b[0] ?? 0, t),\n lerp(a[1] ?? 0, b[1] ?? 0, t),\n lerp(a[2] ?? 0, b[2] ?? 0, t),\n ];\n}\n\nfunction add3(a, b) {\n return [(a[0] ?? 0) + (b[0] ?? 0), (a[1] ?? 0) + (b[1] ?? 0), (a[2] ?? 0) + (b[2] ?? 0)];\n}\n\nfunction sub3(a, b) {\n return [(a[0] ?? 0) - (b[0] ?? 0), (a[1] ?? 0) - (b[1] ?? 0), (a[2] ?? 0) - (b[2] ?? 0)];\n}\n\nfunction length3(value) {\n return Math.hypot(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\n}\n\nfunction normalize3(value, fallback = [0, 0, -1]) {\n const length = length3(value);\n return length > 1e-6\n ? [(value[0] ?? 0) / length, (value[1] ?? 0) / length, (value[2] ?? 0) / length]\n : [...fallback];\n}\n\nfunction scale3(value, scalar) {\n return [(value[0] ?? 0) * scalar, (value[1] ?? 0) * scalar, (value[2] ?? 0) * scalar];\n}\n\nfunction durationFromBeats(beats) {\n return beats.reduce((total, beat) => total + Math.max(1, beat.durationMs ?? 1), 0);\n}\n\nfunction resolveBeat(beats, loopTimeMs) {\n let cursor = 0;\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n if (loopTimeMs < cursor + durationMs) {\n return { beat, startMs: cursor, beatTimeMs: loopTimeMs - cursor, durationMs };\n }\n cursor += durationMs;\n }\n const fallback = beats.at(-1) ?? null;\n return { beat: fallback, startMs: Math.max(0, cursor - (fallback?.durationMs ?? 1)), beatTimeMs: 0, durationMs: fallback?.durationMs ?? 1 };\n}\n\nfunction movementRequirementKind(requirement, beat) {\n return requirement?.kind ?? requirement?.type ?? (beat?.kind === \"locomotion\" ? \"travel\" : \"stationary\");\n}\n\nfunction clipProfileById(clipAssets = []) {\n return new Map(clipAssets.map((clip) => [clip.id, clip.movementProfile ?? clip.profile ?? null]));\n}\n\nfunction validateProfessionalInputs({ characterModel, beats, clipAssets }) {\n const issues = [];\n if (!characterModel) {\n issues.push(\"professional animation requires a skinned GLB character model\");\n } else {\n if (!characterModel.professionalRenderable) {\n issues.push(\"professional animation requires UVs, normals, skinning, diffuse texture, normal texture, and resolved texture buffers\");\n }\n if (characterModel.textureCount <= 0) {\n issues.push(\"professional animation requires at least one model texture\");\n }\n }\n\n const profiles = clipProfileById(clipAssets);\n for (const beat of beats) {\n const kind = movementRequirementKind(beat.movementRequirement, beat);\n if (kind !== \"travel\" && kind !== \"jump\" && kind !== \"root-authored\") {\n continue;\n }\n const profile = profiles.get(beat.clipId);\n if (!profile) {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' without a movement profile`);\n continue;\n }\n if (profile.motionMode !== \"root-authored\" && profile.motionMode !== \"jump\") {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' without authored root motion`);\n }\n if (Number(profile.rootTranslationDistance ?? 0) <= 0) {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' with no root translation distance`);\n }\n }\n return issues;\n}\n\nfunction buildRouteSegments(route) {\n if (route.length < 2) {\n return [];\n }\n return route.slice(1).map((point, index) => {\n const previous = route[index];\n const vector = sub3(point.position, previous.position);\n return {\n start: previous.position,\n end: point.position,\n direction: normalize3(vector),\n distance: length3(vector),\n };\n });\n}\n\nfunction positiveNumber(value) {\n const numberValue = Number(value);\n return Number.isFinite(numberValue) && numberValue > 0 ? numberValue : 0;\n}\n\nfunction movementRequirementDistance(requirement) {\n return positiveNumber(\n requirement?.distance\n ?? requirement?.distanceMeters\n ?? requirement?.rootTranslationDistance\n ?? 0,\n );\n}\n\nfunction resolveRootMotionTravelDistance({ beat, kind, profile, segment, durationMs, elapsedMs }) {\n const rootDistance = positiveNumber(profile?.rootTranslationDistance);\n if (rootDistance <= 0) {\n return { travelled: 0, movementDistance: 0 };\n }\n\n const requestedDistance = movementRequirementDistance(beat.movementRequirement);\n const segmentDistance = positiveNumber(segment?.distance);\n const capDistance = positiveNumber(requestedDistance || segmentDistance) || rootDistance;\n const maxDistance = segmentDistance > 0\n ? Math.min(capDistance, segmentDistance)\n : capDistance;\n\n if (kind === \"jump\") {\n const progress = clamp01(elapsedMs / Math.max(1, durationMs));\n const movementDistance = Math.min(rootDistance, maxDistance);\n return {\n travelled: movementDistance * progress,\n movementDistance,\n };\n }\n\n const profileDurationMs = positiveNumber(profile?.durationMs);\n const loopedDistance = profileDurationMs > 0 && profile?.loopable !== false\n ? rootDistance * (elapsedMs / profileDurationMs)\n : rootDistance * clamp01(elapsedMs / Math.max(1, durationMs));\n const fullDistance = profileDurationMs > 0 && profile?.loopable !== false\n ? rootDistance * (durationMs / profileDurationMs)\n : rootDistance;\n const movementDistance = Math.min(fullDistance, maxDistance);\n\n return {\n travelled: Math.min(loopedDistance, movementDistance),\n movementDistance,\n };\n}\n\nfunction resolveRootMotionPosition({ route, beats, clipAssets, loopTimeMs }) {\n const profiles = clipProfileById(clipAssets);\n const segments = buildRouteSegments(route);\n let position = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n let segmentIndex = 0;\n let cursorMs = 0;\n\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n const profile = profiles.get(beat.clipId);\n const kind = movementRequirementKind(beat.movementRequirement, beat);\n const moves = kind === \"travel\" || kind === \"jump\" || kind === \"root-authored\";\n const active = loopTimeMs >= cursorMs && loopTimeMs < cursorMs + durationMs;\n const elapsedMs = active ? Math.max(0, loopTimeMs - cursorMs) : durationMs;\n if (moves) {\n const segment = segments[Math.min(segmentIndex, Math.max(0, segments.length - 1))];\n if (segment) {\n const { travelled, movementDistance } = resolveRootMotionTravelDistance({\n beat,\n kind,\n profile,\n segment,\n durationMs,\n elapsedMs,\n });\n const nextPosition = add3(position, scale3(segment.direction, travelled));\n if (active) {\n return {\n position: nextPosition,\n forward: segment.direction,\n activeBeat: beat,\n activeProfile: profile,\n activeMovementMode: kind,\n movementDistance,\n };\n }\n position = nextPosition;\n if (length3(sub3(position, segment.end)) < 0.05) {\n segmentIndex += 1;\n position = [...segment.end];\n }\n }\n } else if (active) {\n return {\n position,\n forward: segments[Math.min(segmentIndex, Math.max(0, segments.length - 1))]?.direction ?? [0, 0, -1],\n activeBeat: beat,\n activeProfile: profile,\n activeMovementMode: kind,\n movementDistance: 0,\n };\n }\n cursorMs += durationMs;\n }\n\n return {\n position,\n forward: segments.at(-1)?.direction ?? [0, 0, -1],\n activeBeat: beats.at(-1) ?? null,\n activeProfile: profiles.get(beats.at(-1)?.clipId) ?? null,\n activeMovementMode: \"stationary\",\n movementDistance: 0,\n };\n}\n\nfunction createInitialSnapshot({ characterModel, camera, route }) {\n const position = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n const cameraPosition = add3(position, camera.shoulderOffset ?? camera.offset ?? [-0.9, 2.2, 4.8]);\n return {\n frame: 0,\n running: false,\n renderMode: \"webgpu-pbr\",\n webGpuActive: true,\n texturedSkinnedRenderingActive: true,\n pbrMaterialActive: true,\n shadowPassActive: false,\n fallbackProxyActive: false,\n activeClipId: \"\",\n activeBeatId: \"\",\n activeMovementMode: \"stationary\",\n blendProgress: 0,\n clipTimeMs: 0,\n characterPosition: position,\n cameraPosition,\n cameraTransform: { position: cameraPosition, target: position, up: [0, 1, 0] },\n cameraViewMode: \"cinematic-follow\",\n modelLoaded: Boolean(characterModel),\n modelRenderable: true,\n textureCount: characterModel.textureCount,\n materialCount: characterModel.materialCount,\n normalTextureActive: characterModel.hasNormalTexture,\n skinnedVertexCount: characterModel.vertexCount,\n skinnedTriangleCount: characterModel.triangleCount,\n skinnedJointCount: characterModel.jointCount,\n skinnedAnimatedNodeCount: characterModel.animatedNodeCount,\n skinnedClipCount: characterModel.clipCount,\n activeClipRenderable: false,\n movementValidation: {\n status: \"passed\",\n warnings: [],\n rootMotionPolicy: \"root-motion-required\",\n rootMotionSource: \"none\",\n movementDistance: 0,\n },\n frameState: \"initialized\",\n };\n}\n\nexport async function createProfessionalAnimatedSceneRenderer(options = {}) {\n const adventure = options.animationAdventure ?? {};\n const route = [...(options.route ?? adventure.route ?? [])];\n const beats = [...(options.beats ?? adventure.beats ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n const clipAssets = options.clipAssets ?? adventure.clipAssets ?? [];\n const camera = {\n mode: \"cinematic-follow\",\n offset: [-0.9, 2.2, 4.8],\n shoulderOffset: [-0.9, 2.2, 4.8],\n velocityLookAheadMs: 420,\n yawSmoothingMs: 180,\n pitchSmoothingMs: 240,\n deadZoneRadius: 0.4,\n maxLagDistance: 2.8,\n ...(options.camera ?? adventure.camera ?? {}),\n };\n const characterModel = createAnimatedGltfModel(options.modelAsset ?? adventure.modelAsset, clipAssets);\n const inputIssues = validateProfessionalInputs({ characterModel, beats, clipAssets });\n if (inputIssues.length) {\n throw new Error(`Professional animation renderer cannot start. ${inputIssues.join(\"; \")}`);\n }\n\n const baseRenderer = await createGpuRenderer({\n ...options,\n canvas: options.canvas,\n clearColor: options.clearColor ?? \"#8fb47a\",\n });\n\n let snapshot = createInitialSnapshot({ characterModel, camera, route });\n let running = false;\n let startedAtMs;\n let frame = 0;\n let cameraPosition = [...snapshot.cameraPosition];\n const loopDurationMs = Math.max(1, durationFromBeats(beats));\n\n function renderOnce(timestamp = nowMs()) {\n if (startedAtMs === undefined) {\n startedAtMs = timestamp;\n }\n const loopTimeMs = Math.max(0, timestamp - startedAtMs) % loopDurationMs;\n const beatFrame = resolveBeat(beats, loopTimeMs);\n const motion = resolveRootMotionPosition({ route, beats, clipAssets, loopTimeMs });\n const desiredCamera = add3(motion.position, camera.shoulderOffset ?? camera.offset ?? [-0.9, 2.2, 4.8]);\n const smoothing = clamp01(16.67 / Math.max(1, camera.yawSmoothingMs ?? 180));\n cameraPosition = lerp3(cameraPosition, desiredCamera, smoothing);\n frame += 1;\n baseRenderer.renderOnce(timestamp);\n const sample = characterModel.sample(motion.activeBeat?.clipId, beatFrame.beatTimeMs);\n\n snapshot = {\n ...snapshot,\n frame,\n running,\n activeClipId: motion.activeBeat?.clipId ?? \"\",\n activeBeatId: motion.activeBeat?.id ?? \"\",\n activeMovementMode: motion.activeMovementMode,\n blendProgress: 1,\n clipTimeMs: beatFrame.beatTimeMs,\n characterPosition: motion.position,\n cameraPosition: [...cameraPosition],\n cameraTransform: {\n position: [...cameraPosition],\n target: add3(motion.position, scale3(motion.forward, 0.8)),\n up: [0, 1, 0],\n },\n activeClipRenderable: sample.activeClipRenderable,\n movementValidation: {\n status: \"passed\",\n warnings: [],\n rootMotionPolicy: \"root-motion-required\",\n rootMotionSource: motion.activeProfile?.motionMode ?? \"none\",\n rootTranslationDistance: motion.activeProfile?.rootTranslationDistance ?? 0,\n movementDistance: motion.movementDistance,\n },\n frameState: running ? \"running\" : \"rendered-once\",\n };\n return snapshot;\n }\n\n return {\n start() {\n running = true;\n snapshot = { ...snapshot, running: true, frameState: \"running\" };\n baseRenderer.start();\n },\n resize(width, height, devicePixelRatio = 1) {\n baseRenderer.resize(width, height, devicePixelRatio);\n },\n renderOnce,\n getSnapshot() {\n return {\n ...snapshot,\n characterPosition: [...snapshot.characterPosition],\n cameraPosition: [...snapshot.cameraPosition],\n cameraTransform: {\n position: [...snapshot.cameraTransform.position],\n target: [...snapshot.cameraTransform.target],\n up: [...snapshot.cameraTransform.up],\n },\n movementValidation: {\n ...snapshot.movementValidation,\n warnings: [...snapshot.movementValidation.warnings],\n },\n };\n },\n destroy() {\n running = false;\n snapshot = { ...snapshot, running: false, frameState: \"destroyed\" };\n baseRenderer.destroy();\n },\n };\n}\n","import {\n FEEDBACK_GAME_DIAGNOSTICS_CONTRACT_VERSION,\n feedbackGameDiagnosticSurfaceRegistrations,\n parseFeedbackGameDiagnostics,\n} from \"@plasius/gpu-shared/feedback-diagnostics\";\n\nconst inputKeys = Object.freeze([\n \"featureEnabled\",\n \"capabilityGranted\",\n \"consentConfirmed\",\n \"surfaceId\",\n \"renderer\",\n \"backend\",\n \"viewportWidth\",\n \"viewportHeight\",\n \"frameRate\",\n \"frameTimeMs\",\n \"featureIds\",\n \"counters\",\n \"errorCodes\",\n]);\n\nexport function bucketFeedbackGameViewport(width, height) {\n if (\n typeof width !== \"number\" ||\n typeof height !== \"number\" ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return \"unknown\";\n }\n\n const shorterEdge = Math.min(width, height);\n const longerEdge = Math.max(width, height);\n const size =\n shorterEdge < 600\n ? \"small\"\n : shorterEdge < 900 || longerEdge < 1_440\n ? \"medium\"\n : \"large\";\n const orientation = width > height ? \"landscape\" : \"portrait\";\n return `${size}-${orientation}`;\n}\n\nexport function bucketFeedbackGameFrameRate(frameRate) {\n if (\n typeof frameRate !== \"number\" ||\n !Number.isFinite(frameRate) ||\n frameRate < 0\n ) {\n return \"unknown\";\n }\n if (frameRate < 15) {\n return \"under-15\";\n }\n if (frameRate < 30) {\n return \"15-29\";\n }\n if (frameRate < 60) {\n return \"30-59\";\n }\n return \"60-plus\";\n}\n\nexport function bucketFeedbackGameFrameTime(frameTimeMs) {\n if (\n typeof frameTimeMs !== \"number\" ||\n !Number.isFinite(frameTimeMs) ||\n frameTimeMs < 0\n ) {\n return \"unknown\";\n }\n if (frameTimeMs < 17) {\n return \"under-17ms\";\n }\n if (frameTimeMs < 34) {\n return \"17-33ms\";\n }\n if (frameTimeMs < 67) {\n return \"34-66ms\";\n }\n return \"over-66ms\";\n}\n\nexport function createFeedbackGameDiagnosticSnapshot(input) {\n try {\n return createFeedbackGameDiagnosticSnapshotInternal(input);\n } catch {\n throw new TypeError(\"Invalid privacy-safe renderer diagnostics input.\");\n }\n}\n\nfunction createFeedbackGameDiagnosticSnapshotInternal(input) {\n const snapshot = snapshotInputIfEnabled(input);\n if (snapshot === null) {\n return null;\n }\n\n const registration =\n typeof snapshot.surfaceId === \"string\" &&\n Object.hasOwn(\n feedbackGameDiagnosticSurfaceRegistrations,\n snapshot.surfaceId\n )\n ? feedbackGameDiagnosticSurfaceRegistrations[snapshot.surfaceId]\n : undefined;\n\n return parseFeedbackGameDiagnostics({\n type: \"feedback-game-diagnostics\",\n version: FEEDBACK_GAME_DIAGNOSTICS_CONTRACT_VERSION,\n surfaceId: snapshot.surfaceId,\n consentConfirmed: true,\n provenanceContractId: registration?.provenanceContractId,\n renderer: snapshot.renderer,\n backend: snapshot.backend,\n viewportBucket: bucketFeedbackGameViewport(\n snapshot.viewportWidth,\n snapshot.viewportHeight\n ),\n frameRateBucket: bucketFeedbackGameFrameRate(snapshot.frameRate),\n frameTimeBucket: bucketFeedbackGameFrameTime(snapshot.frameTimeMs),\n featureIds: snapshot.featureIds,\n counters: snapshot.counters,\n errorCodes: snapshot.errorCodes,\n });\n}\n\nfunction snapshotInputIfEnabled(input) {\n assertValid(\n input !== null &&\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n (Object.getPrototypeOf(input) === Object.prototype ||\n Object.getPrototypeOf(input) === null)\n );\n\n const gateKeys = [\n \"featureEnabled\",\n \"capabilityGranted\",\n \"consentConfirmed\",\n ];\n const snapshot = Object.create(null);\n for (const key of gateKeys) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n assertValid(\n descriptor !== undefined &&\n descriptor.enumerable === true &&\n Object.hasOwn(descriptor, \"value\") &&\n typeof descriptor.value === \"boolean\"\n );\n snapshot[key] = descriptor.value;\n }\n\n const { featureEnabled, capabilityGranted, consentConfirmed } = snapshot;\n if (\n !featureEnabled ||\n !capabilityGranted ||\n !consentConfirmed\n ) {\n return null;\n }\n\n const actualKeys = Reflect.ownKeys(input);\n assertValid(\n actualKeys.length === inputKeys.length &&\n inputKeys.every((key) => actualKeys.includes(key)) &&\n actualKeys.every(\n (key) => typeof key === \"string\" && inputKeys.includes(key)\n )\n );\n\n for (const key of inputKeys.filter((key) => !gateKeys.includes(key))) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n assertValid(\n descriptor !== undefined &&\n descriptor.enumerable === true &&\n Object.hasOwn(descriptor, \"value\")\n );\n snapshot[key] = descriptor.value;\n }\n return Object.freeze(snapshot);\n}\n\nfunction assertValid(condition) {\n if (!condition) {\n throw new TypeError(\"Invalid privacy-safe renderer diagnostics input.\");\n }\n}\n","export function createGpuParallelismCounters() {\n return {\n directDispatches: 0,\n directWorkgroups: 0,\n directShaderInvocations: 0,\n multiWorkgroupDispatches: 0,\n largestDirectWorkgroupsPerDispatch: 0,\n indirectDispatches: 0,\n estimatedIndirectWorkgroupsUpperBound: 0,\n estimatedIndirectShaderInvocationsUpperBound: 0,\n indirectDispatchesWithMultiWorkgroupCapacity: 0,\n largestEstimatedIndirectWorkgroupsPerDispatch: 0,\n }\n}\n\nfunction countDispatchWorkgroups(groups) {\n return groups.reduce((product, value) => {\n const numeric = Number(value ?? 1)\n const count = Number.isFinite(numeric) ? Math.max(1, Math.trunc(numeric)) : 1\n return product * count\n }, 1)\n}\n\nexport function recordDirectDispatch(\n parallelism,\n groups,\n invocationsPerWorkgroup = 1\n) {\n const workgroups = countDispatchWorkgroups(groups)\n parallelism.directDispatches += 1\n parallelism.directWorkgroups += workgroups\n parallelism.directShaderInvocations += workgroups * invocationsPerWorkgroup\n parallelism.largestDirectWorkgroupsPerDispatch = Math.max(\n parallelism.largestDirectWorkgroupsPerDispatch,\n workgroups\n )\n if (workgroups > 1) {\n parallelism.multiWorkgroupDispatches += 1\n }\n}\n\nexport function recordIndirectDispatch(\n parallelism,\n estimatedWorkgroupsUpperBound,\n invocationsPerWorkgroup = 1\n) {\n const workgroups = Math.max(1, Math.trunc(Number(estimatedWorkgroupsUpperBound) || 1))\n parallelism.indirectDispatches += 1\n parallelism.estimatedIndirectWorkgroupsUpperBound += workgroups\n parallelism.estimatedIndirectShaderInvocationsUpperBound +=\n workgroups * invocationsPerWorkgroup\n parallelism.largestEstimatedIndirectWorkgroupsPerDispatch = Math.max(\n parallelism.largestEstimatedIndirectWorkgroupsPerDispatch,\n workgroups\n )\n if (workgroups > 1) {\n parallelism.indirectDispatchesWithMultiWorkgroupCapacity += 1\n }\n}\n\nexport function createGpuParallelismDiagnostics(adapterDiagnostics, counters) {\n const totalEstimatedWorkgroupsUpperBound =\n counters.directWorkgroups + counters.estimatedIndirectWorkgroupsUpperBound\n const totalEstimatedShaderInvocationsUpperBound =\n counters.directShaderInvocations +\n counters.estimatedIndirectShaderInvocationsUpperBound\n const exposesMultiWorkgroupParallelism =\n counters.multiWorkgroupDispatches > 0 ||\n counters.indirectDispatchesWithMultiWorkgroupCapacity > 0\n return Object.freeze({\n ...adapterDiagnostics,\n directDispatches: counters.directDispatches,\n directWorkgroups: counters.directWorkgroups,\n directShaderInvocations: counters.directShaderInvocations,\n multiWorkgroupDispatches: counters.multiWorkgroupDispatches,\n largestDirectWorkgroupsPerDispatch: counters.largestDirectWorkgroupsPerDispatch,\n indirectDispatches: counters.indirectDispatches,\n estimatedIndirectWorkgroupsUpperBound: counters.estimatedIndirectWorkgroupsUpperBound,\n estimatedIndirectShaderInvocationsUpperBound:\n counters.estimatedIndirectShaderInvocationsUpperBound,\n indirectDispatchesWithMultiWorkgroupCapacity:\n counters.indirectDispatchesWithMultiWorkgroupCapacity,\n largestEstimatedIndirectWorkgroupsPerDispatch:\n counters.largestEstimatedIndirectWorkgroupsPerDispatch,\n totalEstimatedWorkgroupsUpperBound,\n totalEstimatedShaderInvocationsUpperBound,\n exposesMultiWorkgroupParallelism,\n likelyUsesMoreThanOnePhysicalGpuCore: null,\n coreUtilizationStatus: \"not-exposed-by-webgpu\",\n })\n}\n\nexport function createGpuWorkerJobDiagnostics(\n parallelism,\n commandSubmissions,\n frameTimeMs,\n awaitedGpuCompletion\n) {\n const directDispatchesCompleted = Math.max(0, Number(parallelism?.directDispatches ?? 0))\n const indirectDispatchesCompleted = Math.max(\n 0,\n Number(parallelism?.indirectDispatches ?? 0)\n )\n const completedPerFrame = directDispatchesCompleted + indirectDispatchesCompleted\n const completedPerSubmission =\n commandSubmissions > 0 ? completedPerFrame / commandSubmissions : completedPerFrame\n const completedPerSecond =\n awaitedGpuCompletion && frameTimeMs > 0 ? (completedPerFrame * 1000) / frameTimeMs : null\n return Object.freeze({\n completedPerFrame,\n completedPerSecond,\n completedPerSubmission,\n directDispatchesCompleted,\n indirectDispatchesCompleted,\n frameTimeMs,\n awaitedGpuCompletion,\n })\n}\n\nexport const defaultWavefrontTransportGuardrailThresholds = Object.freeze({\n maxPerJobRegressionRatio: 0.1,\n})\n\nfunction summarizeWavefrontMemory(memory) {\n const entries = Object.entries(memory ?? {}).filter(\n ([key, value]) => key.endsWith(\"Bytes\") && Number.isFinite(value)\n )\n const totalBytes = entries.reduce((total, [, value]) => total + Number(value), 0)\n return Object.freeze({\n totalBytes,\n breakdown: memory ?? null,\n })\n}\n\nfunction normalizeDeviceLossStatus(status, awaitedGpuCompletion) {\n if (status === \"lost\") {\n return \"lost\"\n }\n if (status === \"not-exposed\") {\n return \"not-exposed\"\n }\n if (status === \"pending\") {\n return \"pending\"\n }\n return awaitedGpuCompletion ? \"not-detected\" : \"pending\"\n}\n\nfunction createTransportGuardrailCheck(id, status, details) {\n return Object.freeze({\n id,\n status,\n details,\n })\n}\n\nexport function createWavefrontTransportGuardrailSummary(frameStats, options = {}) {\n const workerJobs = frameStats?.gpuWorkerJobs ?? {}\n const commandSubmissions = Math.max(0, Number(frameStats?.commandSubmissions ?? 0))\n const completedPerFrame = Math.max(0, Number(workerJobs.completedPerFrame ?? 0))\n const completedPerSecond =\n Number.isFinite(workerJobs.completedPerSecond) && workerJobs.completedPerSecond > 0\n ? Number(workerJobs.completedPerSecond)\n : null\n const completedPerSubmission =\n commandSubmissions > 0\n ? completedPerFrame / commandSubmissions\n : Math.max(0, Number(workerJobs.completedPerSubmission ?? completedPerFrame))\n const frameTimeMs = Math.max(0, Number(workerJobs.frameTimeMs ?? 0))\n const awaitedGpuCompletion = workerJobs.awaitedGpuCompletion !== false\n const queueOverflow = Math.max(0, Number(frameStats?.queueOverflow ?? 0))\n const maxFramePassesPerSubmission = Math.max(\n 0,\n Number(frameStats?.maxFramePassesPerSubmission ?? 0)\n )\n const deviceLossStatus = normalizeDeviceLossStatus(\n options.deviceLossStatus ?? frameStats?.deviceLossStatus,\n awaitedGpuCompletion\n )\n const invalidSamples = Math.max(\n 0,\n Number(frameStats?.radianceDiagnostics?.invalidSamples ?? 0)\n )\n const legacyClampEquivalentSamples = Math.max(\n 0,\n Number(frameStats?.radianceDiagnostics?.legacyClampEquivalentSamples ?? 0)\n )\n const rayCountStatus =\n typeof frameStats?.rayCounts?.status === \"string\"\n ? frameStats.rayCounts.status\n : \"not-requested\"\n const rayCountReason =\n typeof frameStats?.rayCounts?.reason === \"string\"\n ? frameStats.rayCounts.reason\n : null\n const memory = summarizeWavefrontMemory(frameStats?.memory)\n const checks = Object.freeze([\n createTransportGuardrailCheck(\n \"device-loss\",\n deviceLossStatus === \"lost\" ? \"fail\" : deviceLossStatus === \"pending\" ? \"warn\" : \"pass\",\n deviceLossStatus === \"lost\"\n ? \"The WebGPU device was lost during or immediately after the frame.\"\n : deviceLossStatus === \"pending\"\n ? \"GPU work was not awaited, so device-loss status is still pending.\"\n : deviceLossStatus === \"not-exposed\"\n ? \"This environment does not expose device-lost diagnostics.\"\n : \"No device loss was detected for this frame.\"\n ),\n createTransportGuardrailCheck(\n \"queue-overflow\",\n queueOverflow > 0 ? \"warn\" : \"pass\",\n queueOverflow > 0\n ? `Queue overflow terminated ${queueOverflow} paths during the frame.`\n : \"No queue-overflow termination was recorded.\"\n ),\n createTransportGuardrailCheck(\n \"submission-batching\",\n commandSubmissions <= 0\n ? \"warn\"\n : maxFramePassesPerSubmission > 1 && completedPerSubmission <= 1\n ? \"warn\"\n : \"pass\",\n commandSubmissions <= 0\n ? \"No command submissions were recorded for the frame.\"\n : maxFramePassesPerSubmission > 1 && completedPerSubmission <= 1\n ? `Only ${completedPerSubmission.toFixed(2)} GPU jobs completed per command submission despite a ${maxFramePassesPerSubmission}-pass ceiling.`\n : `${completedPerFrame} GPU jobs completed across ${commandSubmissions} command submissions (${completedPerSubmission.toFixed(2)} jobs/submission).`\n ),\n createTransportGuardrailCheck(\n \"radiance-diagnostics\",\n invalidSamples > 0 ? \"fail\" : legacyClampEquivalentSamples > 0 ? \"warn\" : \"pass\",\n invalidSamples > 0\n ? `Renderer recorded ${invalidSamples} invalid radiance sample(s); inspect transport math before trusting the frame.`\n : legacyClampEquivalentSamples > 0\n ? `${legacyClampEquivalentSamples} weighted sample(s) exceeded the legacy 4.0 preview clamp threshold; convergence stayed unbiased, but review firefly diagnostics before rollout.`\n : \"No invalid radiance samples or legacy-clamp-equivalent fireflies were recorded.\"\n ),\n createTransportGuardrailCheck(\n \"ray-count-telemetry\",\n rayCountStatus === \"failed\"\n ? \"fail\"\n : rayCountStatus === \"unavailable\"\n ? \"warn\"\n : \"pass\",\n rayCountStatus === \"failed\"\n ? `Ray-count telemetry failed closed: ${rayCountReason ?? \"unknown failure\"}.`\n : rayCountStatus === \"unavailable\"\n ? `Ray-count telemetry was requested but unavailable: ${rayCountReason ?? \"unknown reason\"}.`\n : rayCountStatus === \"available\"\n ? \"Primary, secondary, and total path-segment counts were captured.\"\n : \"Ray-count telemetry was not requested for this frame.\"\n ),\n ])\n const status = checks.some((check) => check.status === \"fail\")\n ? \"fail\"\n : checks.some((check) => check.status === \"warn\")\n ? \"warn\"\n : \"pass\"\n return Object.freeze({\n status,\n thresholds: defaultWavefrontTransportGuardrailThresholds,\n current: Object.freeze({\n jobsPerFrame: completedPerFrame,\n jobsPerSecond: completedPerSecond,\n jobsPerSubmission: completedPerSubmission,\n commandSubmissions,\n frameTimeMs,\n awaitedGpuCompletion,\n maxFramePassesPerSubmission,\n queueOverflow,\n deviceLossStatus,\n radianceDiagnostics: Object.freeze({\n invalidSamples,\n legacyClampEquivalentSamples,\n }),\n rayCountStatus,\n memory,\n }),\n checks,\n })\n}\n\nexport function createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission,\n startingSubmissionCount = 0,\n labelPrefix = \"plasius.wavefront.frame\",\n}) {\n let encodedFramePasses = 0\n let submissionCount = 0\n let encoder = createCommandEncoder()\n\n function createCommandEncoder() {\n return device.createCommandEncoder({\n label: `${labelPrefix}.${frameIndex}.batched.${startingSubmissionCount + submissionCount + 1}`,\n })\n }\n\n function submitCurrentEncoder() {\n if (encodedFramePasses <= 0) {\n return false\n }\n device.queue.submit([encoder.finish()])\n submissionCount += 1\n encodedFramePasses = 0\n encoder = createCommandEncoder()\n return true\n }\n\n return Object.freeze({\n reserve(passCount = 1) {\n if (\n encodedFramePasses > 0 &&\n encodedFramePasses + passCount > maxFramePassesPerSubmission\n ) {\n submitCurrentEncoder()\n }\n encodedFramePasses += passCount\n return encoder\n },\n flush() {\n submitCurrentEncoder()\n return submissionCount\n },\n getSubmissionCount() {\n return submissionCount\n },\n })\n}\n","export const WAVEFRONT_COMPUTE_WORKGROUP_SIZE = 64;\n","import { WAVEFRONT_COMPUTE_WORKGROUP_SIZE } from \"./wavefront-workgroup.js\";\n\nexport const DEFAULT_WIDTH = 1280;\nexport const DEFAULT_HEIGHT = 720;\nexport const DEFAULT_MAX_DEPTH = 6;\nexport const MAX_PATH_TRACING_DEPTH = 32;\nexport const DEFAULT_TILE_SIZE = 128;\nexport const DEFAULT_SAMPLES_PER_PIXEL = 1;\nexport const MAX_SAMPLES_PER_PIXEL = 256;\nexport const DEFAULT_BRDF_LUT_SIZE = 128;\nexport const DEFAULT_BRDF_LUT_SAMPLE_COUNT = 256;\nexport const DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION = 256;\nexport const DEFAULT_SCENE_OBJECT_CAPACITY = 128;\nexport const DEFAULT_ENVIRONMENT_PORTAL_CAPACITY = 32;\nexport const DEFAULT_MEDIUM_PHASE_MODEL = 0;\nexport const WORKGROUP_SIZE = WAVEFRONT_COMPUTE_WORKGROUP_SIZE;\nexport const rendererWavefrontComputeMode = \"webgpu-compute\";\nexport const rendererWavefrontComputeWorkgroupSize = WORKGROUP_SIZE;\nexport const rendererWavefrontComputeStatsStride = 8;\nexport const RAY_RECORD_BYTES = 96;\nexport const HIT_RECORD_BYTES = 256;\nexport const SCENE_OBJECT_RECORD_BYTES = 160;\nexport const MESH_VERTEX_RECORD_BYTES = 48;\nexport const MESH_RANGE_RECORD_BYTES = 240;\nexport const TRIANGLE_RECORD_BYTES = 576;\nexport const GPU_MATERIAL_RECORD_BYTES = 192;\nexport const BVH_NODE_RECORD_BYTES = 48;\nexport const BVH_LEAF_REF_RECORD_BYTES = 16;\nexport const EMISSIVE_TRIANGLE_INDEX_BYTES = 4;\nexport const ENVIRONMENT_PORTAL_RECORD_BYTES = 96;\nexport const MEDIUM_TABLE_ROWS = 2;\nexport const ACCUMULATION_RECORD_BYTES = 16;\nexport const PATH_VERTEX_RECORD_BYTES = 16;\nexport const GPU_SUBMITTED_WORK_TIMEOUT_MS = 5_000;\nexport const GPU_READBACK_COMPLETION_TIMEOUT_MS = 60_000;\nexport const GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS = 60_000;\nexport const GPU_MAX_SUBMITTED_WORK_DEADLINE_MS = 180_000;\nexport const CONFIG_BUFFER_BYTES = 320;\nexport const COUNTER_DISPATCH_ARGS_OFFSET = 16;\nexport const INDIRECT_DISPATCH_ARGS_BYTES = 12;\nexport const COUNTER_BUFFER_BYTES = 128;\nexport const TERMINATION_LUMINANCE_SCALE = 1_000_000;\nexport const COUNTER_TERMINATION_EMISSIVE_OFFSET = 8;\nexport const COUNTER_TERMINATION_ENVIRONMENT_OFFSET = 9;\nexport const COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET = 10;\nexport const COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET = 11;\nexport const COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET = 12;\nexport const COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET = 13;\nexport const COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET = 14;\nexport const COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET = 15;\nexport const COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET = 16;\nexport const COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET = 17;\nexport const COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET = 18;\nexport const COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET = 19;\nexport const COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET = 20;\nexport const COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET = 21;\nexport const COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET = 22;\nexport const COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET = 23;\nexport const COUNTER_TRANSPORT_CHECKSUM_OFFSET = 24;\nexport const TRACE_STORAGE_BUFFER_BINDINGS = 10;\nexport const TRACE_SAMPLED_TEXTURE_BINDINGS = 21;\nexport const BRDF_LUT_UPLOAD_CACHE = new Map();\nexport const HIT_TYPE_SURFACE = 0;\nexport const HIT_TYPE_EMISSIVE = 1;\nexport const TERMINAL_SOURCE_KIND_EMISSIVE = 1;\nexport const TERMINAL_SOURCE_KIND_ENVIRONMENT = 2;\nexport const TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH = 3;\nexport const TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW = 4;\nexport const TERMINAL_SOURCE_KIND_ABSORPTION_NULL = 5;\nexport const TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE = 6;\nexport const TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT = 7;\nexport const TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO = 8;\nexport const MATERIAL_DIFFUSE = 0;\nexport const MATERIAL_METAL = 1;\nexport const MATERIAL_DIELECTRIC = 2;\nexport const MATERIAL_TRANSPARENT = 3;\nexport const MATERIAL_EMISSIVE = 4;\nexport const OBJECT_KIND_SPHERE = 1;\nexport const OBJECT_KIND_BOX = 2;\n\nexport const DEFAULT_CAMERA = Object.freeze({\n position: Object.freeze([0, 1.15, 5.6]),\n target: Object.freeze([0, 0.65, 0]),\n up: Object.freeze([0, 1, 0]),\n fovYDegrees: 46,\n});\n\nexport const DEFAULT_ENVIRONMENT_COLOR = Object.freeze([0.35, 0.43, 0.49, 1]);\nexport const DEFAULT_AMBIENT_COLOR = Object.freeze([0.018, 0.022, 0.026, 1]);\nexport const DEFAULT_ENVIRONMENT_LIGHTING = Object.freeze({\n horizonColor: Object.freeze([0.46, 0.56, 0.68, 1]),\n zenithColor: Object.freeze([0.04, 0.08, 0.16, 1]),\n sunDirection: Object.freeze([0.22, 0.88, 0.42]),\n sunColor: Object.freeze([2.8, 2.65, 2.35, 1]),\n intensity: 1,\n mode: 0,\n exposure: 1,\n sunlitBaseline: 0.16,\n});\n\nexport const EMPTY_TERMINATION_METRICS = Object.freeze({\n termination: Object.freeze({\n emissive: 0,\n environment: 0,\n ambientFallback: 0,\n maxDepth: 0,\n absorptionNull: 0,\n russianRoulette: 0,\n strictMaxDepth: 0,\n deterministicResidualZero: 0,\n }),\n queueOverflow: 0,\n terminalRadiance: Object.freeze({\n totalLuminance: 0,\n ambientResidualLuminance: 0,\n ambientResidualShare: 0,\n }),\n radianceDiagnostics: Object.freeze({\n invalidSamples: 0,\n legacyClampEquivalentSamples: 0,\n }),\n transportContributions: Object.freeze({\n directExplicitLuminance: 0,\n cachedIndirectLuminance: 0,\n stochasticResidualLuminance: 0,\n zeroTerminationCount: 0,\n deterministicChecksum: 0,\n }),\n});\n\nexport const wavefrontPathTracingComputeLimits = Object.freeze({\n workgroupSize: WORKGROUP_SIZE,\n traceStorageBufferBindings: TRACE_STORAGE_BUFFER_BINDINGS,\n traceSampledTextureBindings: TRACE_SAMPLED_TEXTURE_BINDINGS,\n rayRecordBytes: RAY_RECORD_BYTES,\n hitRecordBytes: HIT_RECORD_BYTES,\n sceneObjectRecordBytes: SCENE_OBJECT_RECORD_BYTES,\n meshVertexRecordBytes: MESH_VERTEX_RECORD_BYTES,\n meshRangeRecordBytes: MESH_RANGE_RECORD_BYTES,\n triangleRecordBytes: TRIANGLE_RECORD_BYTES,\n materialRecordBytes: GPU_MATERIAL_RECORD_BYTES,\n bvhNodeRecordBytes: BVH_NODE_RECORD_BYTES,\n bvhLeafReferenceRecordBytes: BVH_LEAF_REF_RECORD_BYTES,\n emissiveTriangleIndexBytes: EMISSIVE_TRIANGLE_INDEX_BYTES,\n emissiveTriangleMetadataRecordBytes: BVH_NODE_RECORD_BYTES,\n environmentPortalRecordBytes: ENVIRONMENT_PORTAL_RECORD_BYTES,\n accumulationRecordBytes: ACCUMULATION_RECORD_BYTES,\n pathVertexRecordBytes: PATH_VERTEX_RECORD_BYTES,\n counterRecordBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchRecordBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n});\n\nexport const wavefrontSceneObjectKinds = Object.freeze({\n sphere: OBJECT_KIND_SPHERE,\n box: OBJECT_KIND_BOX,\n});\n\nexport const wavefrontMaterialKinds = Object.freeze({\n diffuse: MATERIAL_DIFFUSE,\n metal: MATERIAL_METAL,\n dielectric: MATERIAL_DIELECTRIC,\n transparent: MATERIAL_TRANSPARENT,\n emissive: MATERIAL_EMISSIVE,\n});\n\nexport function readPositiveInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return numeric;\n}\n\nexport function readNonNegativeInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric < 0) {\n throw new Error(`${name} must be a non-negative integer.`);\n }\n return numeric;\n}\n\nexport function resolveWavefrontPresentationOutput(value) {\n if (value === undefined || value === null || value === \"tone-mapped\") {\n return \"tone-mapped\";\n }\n if (value === \"linear\") {\n return \"linear\";\n }\n throw new Error(\"presentationOutput must be 'tone-mapped' or 'linear'.\");\n}\n\nexport function readFiniteNumber(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n throw new Error(`${name} must be a finite number.`);\n }\n return numeric;\n}\n\nexport function assertAnalyticDisplayQualityPolicy(options = {}) {\n const meshes = Array.isArray(options.meshes)\n ? options.meshes\n : options.mesh\n ? [options.mesh]\n : [];\n if (options.displayQuality === true && meshes.length === 0) {\n throw new Error(\n \"Display-quality path tracing requires mesh BVH triangle intersections. \" +\n \"The analytic sphere/box wavefront renderer is debug-only.\"\n );\n }\n}\n\nexport function clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function asVec3(value, fallback) {\n if (!Array.isArray(value) && !(ArrayBuffer.isView(value) && value.length >= 3)) {\n return [...fallback];\n }\n return [\n readFiniteNumber(\"vector[0]\", value[0], fallback[0]),\n readFiniteNumber(\"vector[1]\", value[1], fallback[1]),\n readFiniteNumber(\"vector[2]\", value[2], fallback[2]),\n ];\n}\n\nexport function asColor(value, fallback = [1, 1, 1, 1]) {\n if (!Array.isArray(value) && !(ArrayBuffer.isView(value) && value.length >= 3)) {\n return [...fallback];\n }\n return [\n clamp(readFiniteNumber(\"color[0]\", value[0], fallback[0]), 0, 64),\n clamp(readFiniteNumber(\"color[1]\", value[1], fallback[1]), 0, 64),\n clamp(readFiniteNumber(\"color[2]\", value[2], fallback[2]), 0, 64),\n clamp(readFiniteNumber(\"color[3]\", value[3], fallback[3] ?? 1), 0, 1),\n ];\n}\n\nexport function maxComponent(value) {\n return Math.max(value?.[0] ?? 0, value?.[1] ?? 0, value?.[2] ?? 0);\n}\n\nexport function deriveLegacySheenColor(baseColor, sheen, sheenTint) {\n const sheenStrength = clamp(Number(sheen) || 0, 0, 1);\n if (sheenStrength <= 0) {\n return [0, 0, 0, 1];\n }\n const tint = clamp(Number(sheenTint) || 0, 0, 1);\n const base = asColor(baseColor, [1, 1, 1, 1]);\n return [\n clamp((1 - tint) * sheenStrength + base[0] * tint * sheenStrength, 0, 1),\n clamp((1 - tint) * sheenStrength + base[1] * tint * sheenStrength, 0, 1),\n clamp((1 - tint) * sheenStrength + base[2] * tint * sheenStrength, 0, 1),\n 1,\n ];\n}\n\nexport function resolveSheenColor(input, fallbackBaseColor) {\n if (input?.sheenColor || input?.material?.sheenColor) {\n return asColor(input.sheenColor ?? input.material?.sheenColor, [0, 0, 0, 1]).map((value, index) =>\n index < 3 ? clamp(value, 0, 1) : 1\n );\n }\n return deriveLegacySheenColor(\n fallbackBaseColor,\n input?.sheen ?? input?.material?.sheen,\n input?.sheenTint ?? input?.material?.sheenTint\n );\n}\n\nexport function resolveEnvironmentMap(input = null) {\n const source = input && typeof input === \"object\" ? input : null;\n const hasTexture = Boolean(source?.view || source?.texture || source?.data);\n const width = readPositiveInteger(\"environmentMap.width\", source?.width, 1);\n const height = readPositiveInteger(\"environmentMap.height\", source?.height, 1);\n return Object.freeze({\n enabled: hasTexture && source?.enabled !== false,\n width,\n height,\n mipLevelCount: readPositiveInteger(\n \"environmentMap.mipLevelCount\",\n source?.mipLevelCount,\n 1\n ),\n format: typeof source?.format === \"string\" ? source.format : \"rgba16float\",\n projection: typeof source?.projection === \"string\" ? source.projection : \"equirectangular\",\n texture: source?.texture ?? null,\n view: source?.view ?? null,\n sampler: source?.sampler ?? null,\n data: source?.data ?? null,\n intensity: Math.max(0, readFiniteNumber(\"environmentMap.intensity\", source?.intensity ?? source?.radianceScale, 1)),\n rotationRadians: readFiniteNumber(\"environmentMap.rotationRadians\", source?.rotationRadians ?? source?.rotation, 0),\n ambientStrength: Math.max(\n 0,\n readFiniteNumber(\"environmentMap.ambientStrength\", source?.ambientStrength, 0.32)\n ),\n hasImportanceData: source?.hasImportanceData === true,\n });\n}\n\nexport function resolveDeferredPathResolve(options = {}) {\n const value =\n options.deferredPathResolve ??\n options.deferredResolve ??\n options.pathResolve?.deferred ??\n true;\n return value !== false;\n}\n\nexport function resolveStrictPhysicalLowSppLighting(options = {}) {\n const value =\n options.strictPhysicalLowSppLighting ??\n options.featureFlags?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.enabled?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.flags?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.renderer?.transport?.strictPhysicalLowSppLighting ??\n false;\n return value === true;\n}\n\nfunction readBooleanFeatureFlag(options, dottedName, nestedReader) {\n const value =\n options[dottedName] ??\n options.featureFlags?.[dottedName] ??\n options.featureFlags?.enabled?.[dottedName] ??\n options.featureFlags?.flags?.[dottedName] ??\n nestedReader?.(options.featureFlags) ??\n false;\n return value === true;\n}\n\nexport const WAVEFRONT_TRANSPORT_EXPERIMENT_BITS = Object.freeze({\n stableSampleRouting: 1 << 0,\n strictZeroOverflow: 1 << 1,\n deferLowSppRussianRoulette: 1 << 2,\n deterministicDirectLighting: 1 << 3,\n productStudioImportance: 1 << 4,\n productTransportTelemetry: 1 << 5,\n sourceStableDirectLighting: 1 << 6,\n deterministicLowSppIndirect: 1 << 7,\n});\n\nexport function resolveTransportExperiments(options = {}, strictPhysicalLowSppLighting = false) {\n const requested = Object.freeze({\n stableSampleRouting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.stableSampleRouting.enabled\",\n (flags) => flags?.renderer?.transport?.stableSampleRouting\n ),\n strictZeroOverflow: readBooleanFeatureFlag(\n options,\n \"renderer.transport.strictZeroOverflow.enabled\",\n (flags) => flags?.renderer?.transport?.strictZeroOverflow\n ),\n deferLowSppRussianRoulette: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deferLowSppRussianRoulette.enabled\",\n (flags) => flags?.renderer?.transport?.deferLowSppRussianRoulette\n ),\n deterministicDirectLighting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deterministicDirectLighting.enabled\",\n (flags) => flags?.renderer?.transport?.deterministicDirectLighting\n ),\n sourceStableDirectLighting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.sourceStableDirectLighting.enabled\",\n (flags) => flags?.renderer?.transport?.sourceStableDirectLighting?.enabled\n ?? flags?.renderer?.transport?.sourceStableDirectLighting\n ),\n deterministicLowSppIndirect: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deterministicLowSppIndirect.enabled\",\n (flags) => flags?.renderer?.transport?.deterministicLowSppIndirect?.enabled\n ?? flags?.renderer?.transport?.deterministicLowSppIndirect\n ),\n productStudioImportance: readBooleanFeatureFlag(\n options,\n \"renderer.environment.productStudioImportance.enabled\",\n (flags) => flags?.renderer?.environment?.productStudioImportance\n ),\n productTransportTelemetry: readBooleanFeatureFlag(\n options,\n \"renderer.diagnostics.productTransportTelemetry.enabled\",\n (flags) => flags?.renderer?.diagnostics?.productTransportTelemetry\n ),\n });\n const effective = Object.freeze({\n stableSampleRouting: requested.stableSampleRouting,\n strictZeroOverflow: requested.strictZeroOverflow && strictPhysicalLowSppLighting,\n deferLowSppRussianRoulette:\n requested.deferLowSppRussianRoulette && strictPhysicalLowSppLighting,\n deterministicDirectLighting:\n (\n requested.deterministicDirectLighting\n || requested.sourceStableDirectLighting\n || requested.deterministicLowSppIndirect\n )\n && strictPhysicalLowSppLighting,\n productStudioImportance: requested.productStudioImportance,\n productTransportTelemetry: requested.productTransportTelemetry,\n sourceStableDirectLighting:\n requested.sourceStableDirectLighting && strictPhysicalLowSppLighting,\n deterministicLowSppIndirect:\n requested.deterministicLowSppIndirect && strictPhysicalLowSppLighting,\n });\n let bitmask = 0;\n for (const [key, bit] of Object.entries(WAVEFRONT_TRANSPORT_EXPERIMENT_BITS)) {\n if (effective[key]) {\n bitmask |= bit;\n }\n }\n return Object.freeze({ requested, effective, bitmask: bitmask >>> 0 });\n}\n\nexport function emissionPower(emission) {\n return Math.max(0, emission?.[0] ?? 0) + Math.max(0, emission?.[1] ?? 0) + Math.max(0, emission?.[2] ?? 0);\n}\n\nexport function asUnitVec3(value, fallback) {\n const vector = asVec3(value, fallback);\n return normalize(vector, fallback);\n}\n\nexport function add(a, b) {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\nexport function subtract(a, b) {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nexport function scale(a, scalar) {\n return [a[0] * scalar, a[1] * scalar, a[2] * scalar];\n}\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cross(a, b) {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n ];\n}\n\nexport function normalize(value, fallback = [0, 0, 1]) {\n const length = Math.hypot(value[0], value[1], value[2]);\n if (!Number.isFinite(length) || length <= 0.000001) {\n return [...fallback];\n }\n return [value[0] / length, value[1] / length, value[2] / length];\n}\n\nexport function hashUint32(value) {\n let x = value >>> 0;\n x = ((((x >>> 16) ^ x) >>> 0) * 0x45d9f3b) >>> 0;\n x = ((((x >>> 16) ^ x) >>> 0) * 0x45d9f3b) >>> 0;\n return ((x >>> 16) ^ x) >>> 0;\n}\n\nexport function mixSeed(pixelId, sampleId, bounce, frameIndex, dimension) {\n let x =\n ((pixelId >>> 0) * 747796405) ^\n ((sampleId >>> 0) * 2891336453) ^\n ((bounce >>> 0) * 277803737) ^\n ((frameIndex >>> 0) * 1442695041) ^\n ((dimension >>> 0) * 1597334677);\n x >>>= 0;\n x ^= x >>> 16;\n x = (x * 0x7feb352d) >>> 0;\n x ^= x >>> 15;\n x = (x * 0x846ca68b) >>> 0;\n x ^= x >>> 16;\n return x >>> 0;\n}\n\nexport function random01FromSeed(seed) {\n return (hashUint32(seed) & 0x00ffffff) / 16777215;\n}\n\nexport function getArrayLikeLength(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value) ? value.length : 0;\n}\n\nexport function readVector(values, index, componentCount, fallback) {\n const offset = index * componentCount;\n const output = [];\n for (let component = 0; component < componentCount; component += 1) {\n output.push(readFiniteNumber(\"mesh attribute\", values?.[offset + component], fallback[component] ?? 0));\n }\n return output;\n}\n\nexport function readVector2(values, index, fallback = [0, 0]) {\n return readVector(values, index, 2, fallback);\n}\n\nexport function triangleBounds(v0, v1, v2) {\n return {\n min: [\n Math.min(v0[0], v1[0], v2[0]),\n Math.min(v0[1], v1[1], v2[1]),\n Math.min(v0[2], v1[2], v2[2]),\n ],\n max: [\n Math.max(v0[0], v1[0], v2[0]),\n Math.max(v0[1], v1[1], v2[1]),\n Math.max(v0[2], v1[2], v2[2]),\n ],\n };\n}\n\nexport function mergeBounds(left, right) {\n if (!left) {\n return {\n min: [...right.min],\n max: [...right.max],\n };\n }\n return {\n min: [\n Math.min(left.min[0], right.min[0]),\n Math.min(left.min[1], right.min[1]),\n Math.min(left.min[2], right.min[2]),\n ],\n max: [\n Math.max(left.max[0], right.max[0]),\n Math.max(left.max[1], right.max[1]),\n Math.max(left.max[2], right.max[2]),\n ],\n };\n}\n\nexport function boundsCentroid(bounds) {\n return [\n (bounds.min[0] + bounds.max[0]) * 0.5,\n (bounds.min[1] + bounds.max[1]) * 0.5,\n (bounds.min[2] + bounds.max[2]) * 0.5,\n ];\n}\n","export function writeVec4(floatView, byteOffset, value) {\n const offset = byteOffset / 4;\n floatView[offset] = value?.[0] ?? 0;\n floatView[offset + 1] = value?.[1] ?? 0;\n floatView[offset + 2] = value?.[2] ?? 0;\n floatView[offset + 3] = value?.[3] ?? 0;\n}\n","import {\n DEFAULT_MEDIUM_PHASE_MODEL,\n MATERIAL_DIELECTRIC,\n MATERIAL_DIFFUSE,\n MATERIAL_EMISSIVE,\n MATERIAL_METAL,\n MATERIAL_TRANSPARENT,\n asColor,\n asVec3,\n clamp,\n readFiniteNumber,\n readNonNegativeInteger,\n} from \"./wavefront-core.js\";\n\nexport function readMaterialKind(value) {\n if (typeof value === \"number\") {\n return clamp(Math.trunc(value), MATERIAL_DIFFUSE, MATERIAL_EMISSIVE);\n }\n switch (value) {\n case \"metal\":\n case \"reflective\":\n return MATERIAL_METAL;\n case \"dielectric\":\n case \"refractive\":\n case \"glass\":\n return MATERIAL_DIELECTRIC;\n case \"transparent\":\n case \"transmission\":\n return MATERIAL_TRANSPARENT;\n case \"emissive\":\n case \"light\":\n return MATERIAL_EMISSIVE;\n case \"diffuse\":\n default:\n return MATERIAL_DIFFUSE;\n }\n}\n\nfunction deriveBeerLambertAbsorptionFromAttenuationColor(\n attenuationColor,\n attenuationDistance,\n density = 1\n) {\n const distance = Number(attenuationDistance);\n const densityScale = Math.max(0, Number(density) || 0);\n if (!Number.isFinite(distance) || distance <= 0 || densityScale <= 0) {\n return [0, 0, 0];\n }\n return attenuationColor.slice(0, 3).map((channel) => {\n const clamped = clamp(Number(channel) || 0, 0.0001, 1);\n return Math.max(0, (-Math.log(clamped) / distance) * densityScale);\n });\n}\n\nfunction readMediumPhaseModel(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, Math.trunc(value));\n }\n switch (String(value ?? \"\").trim().toLowerCase()) {\n case \"isotropic\":\n default:\n return DEFAULT_MEDIUM_PHASE_MODEL;\n }\n}\n\nfunction resolveWavefrontVolumeInput(input) {\n if (input?.volume ?? input?.material?.volume) {\n return input.volume ?? input.material.volume;\n }\n const extension = resolveExtension(input, \"volume\");\n return Object.keys(extension).length > 0 ? extension : null;\n}\n\nfunction resolveMaterialExtensions(input) {\n return input?.extensions ?? input?.material?.extensions ?? input?.materialExtensions ?? {};\n}\n\nfunction resolveExtension(input, name) {\n const extensions = resolveMaterialExtensions(input);\n return extensions[name] ?? extensions[`KHR_materials_${name}`] ?? {};\n}\n\nfunction readExtensionNumber(input, extensionName, key, fallback) {\n const extension = resolveExtension(input, extensionName);\n return readFiniteNumber(\n `KHR_materials_${extensionName}.${key}`,\n extension[key],\n fallback\n );\n}\n\nfunction resolveExtensionTexture(input, extensionName, key) {\n const extension = resolveExtension(input, extensionName);\n return extension[key] ?? null;\n}\n\nexport function normalizeWavefrontMaterialExtensions(input = {}) {\n const clearcoat = resolveExtension(input, \"clearcoat\");\n const ior = resolveExtension(input, \"ior\");\n const transmission = resolveExtension(input, \"transmission\");\n const volume = resolveExtension(input, \"volume\");\n const sheen = resolveExtension(input, \"sheen\");\n const specular = resolveExtension(input, \"specular\");\n const iridescence = resolveExtension(input, \"iridescence\");\n const anisotropy = resolveExtension(input, \"anisotropy\");\n const unlit = resolveExtension(input, \"unlit\");\n return Object.freeze({\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", clearcoat.clearcoatFactor, input.clearcoat ?? input.material?.clearcoat ?? 0), 0, 1),\n clearcoatRoughness: clamp(readFiniteNumber(\"clearcoatRoughness\", clearcoat.clearcoatRoughnessFactor, input.clearcoatRoughness ?? input.material?.clearcoatRoughness ?? 0.08), 0, 1),\n ior: clamp(readFiniteNumber(\"ior\", ior.ior, input.ior ?? input.material?.ior ?? 1.45), 1, 3),\n transmission: clamp(readFiniteNumber(\"transmission\", transmission.transmissionFactor, input.transmission ?? input.material?.transmission ?? 0), 0, 1),\n volumeThickness: Math.max(0, readFiniteNumber(\"volume.thicknessFactor\", volume.thicknessFactor, input.thickness ?? input.material?.thickness ?? 0)),\n sheenColor: Object.freeze(asColor(sheen.sheenColorFactor ?? input.sheenColor ?? input.material?.sheenColor, [0, 0, 0, 1])),\n sheenRoughness: clamp(readFiniteNumber(\"sheenRoughness\", sheen.sheenRoughnessFactor, 0), 0, 1),\n specular: clamp(readFiniteNumber(\"specular\", specular.specularFactor, input.specular ?? input.material?.specular ?? 1), 0, 1),\n specularColor: Object.freeze(asColor(specular.specularColorFactor ?? input.specularColor ?? input.material?.specularColor, [1, 1, 1, 1])),\n iridescence: clamp(readFiniteNumber(\"iridescence\", iridescence.iridescenceFactor, 0), 0, 1),\n iridescenceIor: clamp(readFiniteNumber(\"iridescenceIor\", iridescence.iridescenceIor, 1.3), 1, 3),\n iridescenceThicknessMinimum: Math.max(0, readFiniteNumber(\"iridescenceThicknessMinimum\", iridescence.iridescenceThicknessMinimum, 100)),\n iridescenceThicknessMaximum: Math.max(0, readFiniteNumber(\"iridescenceThicknessMaximum\", iridescence.iridescenceThicknessMaximum, 400)),\n dispersion: clamp(readExtensionNumber(input, \"dispersion\", \"dispersion\", 0), 0, 2),\n anisotropy: clamp(readFiniteNumber(\"anisotropy\", anisotropy.anisotropyStrength, 0), 0, 1),\n anisotropyRotation: readFiniteNumber(\"anisotropyRotation\", anisotropy.anisotropyRotation, 0),\n unlit: Object.keys(unlit).length > 0,\n textures: Object.freeze({\n clearcoat: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatTexture\"),\n clearcoatRoughness: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatRoughnessTexture\"),\n clearcoatNormal: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatNormalTexture\"),\n transmission: resolveExtensionTexture(input, \"transmission\", \"transmissionTexture\"),\n thickness: resolveExtensionTexture(input, \"volume\", \"thicknessTexture\"),\n sheenColor: resolveExtensionTexture(input, \"sheen\", \"sheenColorTexture\"),\n sheenRoughness: resolveExtensionTexture(input, \"sheen\", \"sheenRoughnessTexture\"),\n specular: resolveExtensionTexture(input, \"specular\", \"specularTexture\"),\n specularColor: resolveExtensionTexture(input, \"specular\", \"specularColorTexture\"),\n iridescence: resolveExtensionTexture(input, \"iridescence\", \"iridescenceTexture\"),\n iridescenceThickness: resolveExtensionTexture(input, \"iridescence\", \"iridescenceThicknessTexture\"),\n anisotropy: resolveExtensionTexture(input, \"anisotropy\", \"anisotropyTexture\"),\n }),\n });\n}\n\nexport function normalizeWavefrontThickness(input, label) {\n const volume = resolveWavefrontVolumeInput(input);\n return Math.max(\n 0,\n readFiniteNumber(\n label,\n input?.thickness ?? volume?.thickness ?? input?.material?.thickness,\n 0\n )\n );\n}\n\nfunction resolveWavefrontMediumId(input, fallbackId = 1) {\n return (\n input?.mediumRefId ??\n input?.mediumId ??\n input?.material?.mediumId ??\n input?.materialRefId ??\n input?.material?.id ??\n input?.materialId ??\n input?.id ??\n fallbackId\n );\n}\n\nexport function deriveWavefrontTransportMedium(input, fallbackId = 1) {\n const resolvedId = resolveWavefrontMediumId(input, fallbackId);\n if (input?.medium) {\n return normalizeWavefrontMedium(\n {\n ...input.medium,\n id: input.medium.id ?? input.medium.mediumId ?? resolvedId,\n },\n fallbackId\n );\n }\n const volume = resolveWavefrontVolumeInput(input);\n if (!volume) {\n return null;\n }\n return normalizeWavefrontMedium(\n {\n id: resolvedId,\n phaseModel: volume.phaseModel,\n density: volume.density,\n attenuationColor: volume.attenuationColor,\n attenuationDistance: volume.attenuationDistance,\n absorption: volume.absorption,\n scattering: volume.scattering,\n },\n fallbackId\n );\n}\n\nfunction normalizeWavefrontMedium(input = {}, index = 0) {\n const id = readNonNegativeInteger(\"medium id\", input.id ?? input.mediumId, index);\n const density = Math.max(0, readFiniteNumber(\"medium density\", input.density, 1));\n const attenuationColor = asColor(\n input.attenuationColor ?? input.color ?? input.medium?.attenuationColor,\n [1, 1, 1, 1]\n );\n const attenuationDistance = readFiniteNumber(\n \"medium attenuationDistance\",\n input.attenuationDistance ?? input.distance ?? input.medium?.attenuationDistance,\n 0\n );\n const absorption =\n Array.isArray(input.absorption) || Array.isArray(input.medium?.absorption)\n ? asVec3(input.absorption ?? input.medium?.absorption, [0, 0, 0]).map((value) =>\n Math.max(0, Number(value) || 0)\n )\n : deriveBeerLambertAbsorptionFromAttenuationColor(\n attenuationColor,\n attenuationDistance,\n density\n );\n const scattering = asVec3(\n input.scattering ?? input.medium?.scattering,\n [0, 0, 0]\n ).map((value) => Math.max(0, Number(value) || 0));\n return Object.freeze({\n id,\n phaseModel: readMediumPhaseModel(input.phaseModel ?? input.medium?.phaseModel),\n density,\n attenuationColor: Object.freeze(attenuationColor),\n attenuationDistance,\n absorption: Object.freeze(absorption),\n scattering: Object.freeze(scattering),\n });\n}\n\nexport function collectWavefrontMediums(options, meshes, sceneObjects = []) {\n const mediumsById = new Map();\n mediumsById.set(\n 0,\n Object.freeze({\n id: 0,\n phaseModel: DEFAULT_MEDIUM_PHASE_MODEL,\n density: 0,\n attenuationColor: Object.freeze([1, 1, 1, 1]),\n attenuationDistance: 0,\n absorption: Object.freeze([0, 0, 0]),\n scattering: Object.freeze([0, 0, 0]),\n })\n );\n\n const register = (input, fallbackId = mediumsById.size) => {\n if (!input) {\n return;\n }\n const normalized = normalizeWavefrontMedium(\n typeof input === \"object\" ? { id: fallbackId, ...input } : { id: fallbackId },\n fallbackId\n );\n const existing = mediumsById.get(normalized.id);\n if (existing && JSON.stringify(existing) !== JSON.stringify(normalized)) {\n throw new Error(`Medium id ${normalized.id} is defined more than once with different values.`);\n }\n mediumsById.set(normalized.id, normalized);\n };\n\n for (const medium of options.mediums ?? []) {\n register(medium);\n }\n for (const mesh of meshes) {\n register(mesh.medium, mesh.mediumRefId ?? mesh.medium?.id ?? 0);\n }\n for (const mesh of meshes) {\n if ((mesh.mediumRefId ?? 0) > 0 && !mediumsById.has(mesh.mediumRefId)) {\n register({ id: mesh.mediumRefId });\n }\n }\n for (const object of sceneObjects) {\n register(object.medium, object.mediumRefId ?? object.medium?.id ?? 0);\n }\n for (const object of sceneObjects) {\n if ((object.mediumRefId ?? 0) > 0 && !mediumsById.has(object.mediumRefId)) {\n register({ id: object.mediumRefId });\n }\n }\n\n return Object.freeze(\n Array.from(mediumsById.values()).sort((left, right) => left.id - right.id)\n );\n}\n","import {\n MATERIAL_EMISSIVE,\n MATERIAL_TRANSPARENT,\n OBJECT_KIND_BOX,\n OBJECT_KIND_SPHERE,\n add,\n asColor,\n asVec3,\n clamp,\n getArrayLikeLength,\n readFiniteNumber,\n readNonNegativeInteger,\n resolveSheenColor,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n deriveWavefrontTransportMedium,\n normalizeWavefrontMaterialExtensions,\n normalizeWavefrontThickness,\n readMaterialKind,\n} from \"./wavefront-materials.js\";\n\nfunction readObjectKind(value) {\n if (typeof value === \"number\") {\n return value === OBJECT_KIND_BOX ? OBJECT_KIND_BOX : OBJECT_KIND_SPHERE;\n }\n switch (value) {\n case \"box\":\n case \"aabb\":\n case \"bounds\":\n return OBJECT_KIND_BOX;\n case \"sphere\":\n default:\n return OBJECT_KIND_SPHERE;\n }\n}\n\nfunction deriveBounds(input) {\n if (Array.isArray(input?.min) && Array.isArray(input?.max)) {\n const min = asVec3(input.min, [-0.5, -0.5, -0.5]);\n const max = asVec3(input.max, [0.5, 0.5, 0.5]);\n return {\n center: scale(add(min, max), 0.5),\n halfExtent: scale(subtract(max, min), 0.5).map((value) => Math.max(value, 0.001)),\n };\n }\n\n if (Array.isArray(input?.bounds?.min) && Array.isArray(input?.bounds?.max)) {\n return deriveBounds(input.bounds);\n }\n\n return null;\n}\n\nexport function normalizeWavefrontSceneObject(input = {}, index = 0) {\n const bounds = deriveBounds(input);\n const kind = readObjectKind(input.kind ?? input.type ?? (bounds ? \"box\" : \"sphere\"));\n const center = asVec3(input.center ?? input.position ?? bounds?.center, [0, 0, 0]);\n const radius = readFiniteNumber(\"radius\", input.radius, 0.5);\n const halfExtent =\n kind === OBJECT_KIND_SPHERE\n ? [Math.max(radius, 0.001), Math.max(radius, 0.001), Math.max(radius, 0.001)]\n : asVec3(\n input.halfExtent ?? input.halfExtents ?? input.extents ?? bounds?.halfExtent,\n [0.5, 0.5, 0.5]\n ).map((value) => Math.max(value, 0.001));\n const materialKindInput = input.materialKind ?? input.material?.kind;\n const materialKind = readMaterialKind(materialKindInput);\n const materialExtensions = normalizeWavefrontMaterialExtensions(input);\n const color = asColor(\n input.color ??\n input.baseColor ??\n input.albedo ??\n input.material?.color ??\n input.material?.baseColor,\n [0.72, 0.72, 0.68, 1]\n );\n const emission = asColor(\n input.emission ?? input.emissive ?? input.material?.emission ?? input.material?.emissive,\n [0, 0, 0, 1]\n );\n const opacity = clamp(readFiniteNumber(\"opacity\", input.opacity ?? input.material?.opacity, color[3] ?? 1), 0, 1);\n const transmission = clamp(\n readFiniteNumber(\"transmission\", input.transmission ?? input.material?.transmission, materialExtensions.transmission),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, materialExtensions.sheenColor ?? color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor ?? materialExtensions.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 1));\n const medium = deriveWavefrontTransportMedium(input, index + 1);\n const resolvedMaterialKind =\n emission[0] > 0 || emission[1] > 0 || emission[2] > 0\n ? MATERIAL_EMISSIVE\n : materialKindInput === undefined || materialKindInput === null\n ? transmission > 0.001 || opacity < 0.999\n ? MATERIAL_TRANSPARENT\n : materialKind\n : materialKind;\n\n return Object.freeze({\n id: readNonNegativeInteger(\"id\", input.id, index + 1),\n kind,\n materialKind: resolvedMaterialKind,\n flags: readNonNegativeInteger(\"flags\", input.flags, 0),\n mediumRefId: readNonNegativeInteger(\n \"mediumRefId\",\n input.mediumRefId ?? medium?.id ?? input.medium?.id ?? input.mediumId,\n 0\n ),\n medium,\n center: Object.freeze(center),\n halfExtent: Object.freeze(halfExtent),\n color: Object.freeze(color),\n emission: Object.freeze(emission),\n roughness: clamp(readFiniteNumber(\"roughness\", input.roughness ?? input.material?.roughness, 0.72), 0, 1),\n metallic: clamp(readFiniteNumber(\"metallic\", input.metallic ?? input.material?.metallic, 0), 0, 1),\n opacity,\n ior: clamp(readFiniteNumber(\"ior\", input.ior ?? input.material?.ior, materialExtensions.ior), 1, 3),\n sheen: clamp(readFiniteNumber(\"sheen\", input.sheen ?? input.material?.sheen, 0), 0, 1),\n sheenTint: clamp(readFiniteNumber(\"sheenTint\", input.sheenTint ?? input.material?.sheenTint, 0), 0, 1),\n sheenColor: Object.freeze(sheenColor),\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", input.clearcoat ?? input.material?.clearcoat, materialExtensions.clearcoat), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n materialExtensions.clearcoatRoughness\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, materialExtensions.specular), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: Math.max(normalizeWavefrontThickness(input, \"thickness\"), materialExtensions.volumeThickness),\n transmission,\n materialExtensions,\n });\n}\n\nexport function createDefaultWavefrontSceneObjects() {\n return Object.freeze([\n normalizeWavefrontSceneObject({\n type: \"box\",\n id: 1,\n center: [0, -0.08, 0],\n halfExtent: [3.25, 0.08, 3.25],\n color: [0.45, 0.53, 0.54, 1],\n roughness: 0.5,\n }),\n normalizeWavefrontSceneObject({\n type: \"box\",\n id: 2,\n center: [0, 1.25, -1.65],\n halfExtent: [2.45, 1.45, 0.08],\n color: [0.42, 0.41, 0.38, 1],\n roughness: 0.85,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 3,\n center: [-0.9, 0.72, 0.05],\n radius: 0.72,\n color: [0.76, 0.72, 0.64, 1],\n materialKind: \"metal\",\n roughness: 0.08,\n metallic: 0.7,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 4,\n center: [0.85, 0.65, -0.05],\n radius: 0.58,\n color: [0.68, 0.82, 0.86, 0.72],\n materialKind: \"dielectric\",\n roughness: 0.02,\n opacity: 0.72,\n ior: 1.35,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 5,\n center: [0, 2.55, -0.65],\n radius: 0.34,\n color: [1, 0.94, 0.78, 1],\n emission: [7.2, 6.5, 4.2, 1],\n materialKind: \"emissive\",\n }),\n ]);\n}\n\nexport function normalizeWavefrontMesh(input = {}, meshIndex = 0) {\n const positions = input.positions;\n const positionLength = getArrayLikeLength(positions);\n if (positionLength < 9 || positionLength % 3 !== 0) {\n throw new Error(\"Wavefront mesh positions must contain at least three vec3 vertices.\");\n }\n\n const vertexCount = positionLength / 3;\n const indices =\n getArrayLikeLength(input.indices) > 0\n ? Array.from(input.indices, (value) => readNonNegativeInteger(\"mesh index\", value, 0))\n : Array.from({ length: vertexCount }, (_, index) => index);\n if (indices.length < 3 || indices.length % 3 !== 0) {\n throw new Error(\"Wavefront mesh indices must contain complete triangles.\");\n }\n if (indices.some((index) => index >= vertexCount)) {\n throw new Error(\"Wavefront mesh index references a vertex outside the position buffer.\");\n }\n\n const normals =\n getArrayLikeLength(input.normals) >= positionLength\n ? Array.from(input.normals, (value) => readFiniteNumber(\"mesh normal\", value, 0))\n : null;\n const uvs =\n getArrayLikeLength(input.uvs ?? input.texcoords ?? input.uv) >= vertexCount * 2\n ? Array.from(input.uvs ?? input.texcoords ?? input.uv, (value) =>\n readFiniteNumber(\"mesh uv\", value, 0)\n )\n : null;\n const materialKindInput = input.materialKind ?? input.material?.kind;\n const materialKind = readMaterialKind(materialKindInput);\n const materialExtensions = normalizeWavefrontMaterialExtensions(input);\n const color = asColor(\n input.color ??\n input.baseColor ??\n input.albedo ??\n input.material?.color ??\n input.material?.baseColor,\n [0.72, 0.72, 0.68, 1]\n );\n const emission = asColor(\n input.emission ?? input.emissive ?? input.material?.emission ?? input.material?.emissive,\n [0, 0, 0, 1]\n );\n const opacity = clamp(readFiniteNumber(\"opacity\", input.opacity ?? input.material?.opacity, color[3] ?? 1), 0, 1);\n const transmission = clamp(\n readFiniteNumber(\"transmission\", input.transmission ?? input.material?.transmission, materialExtensions.transmission),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, materialExtensions.sheenColor ?? color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor ?? materialExtensions.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 1));\n const medium = deriveWavefrontTransportMedium(input, meshIndex + 1);\n const resolvedMaterialKind =\n emission[0] > 0 || emission[1] > 0 || emission[2] > 0\n ? MATERIAL_EMISSIVE\n : materialKindInput === undefined || materialKindInput === null\n ? transmission > 0.001 || opacity < 0.999\n ? MATERIAL_TRANSPARENT\n : materialKind\n : materialKind;\n\n return Object.freeze({\n id: readNonNegativeInteger(\"mesh id\", input.id, meshIndex + 1),\n positions: Object.freeze(Array.from(positions, (value) => readFiniteNumber(\"mesh position\", value, 0))),\n indices: Object.freeze(indices),\n normals: normals ? Object.freeze(normals) : null,\n uvs: uvs ? Object.freeze(uvs) : null,\n materialKind: resolvedMaterialKind,\n flags: readNonNegativeInteger(\"mesh flags\", input.flags, 0),\n materialRefId: readNonNegativeInteger(\n \"mesh materialRefId\",\n input.materialRefId ?? input.material?.id ?? input.materialId,\n meshIndex\n ),\n mediumRefId: readNonNegativeInteger(\n \"mesh mediumRefId\",\n input.mediumRefId ??\n medium?.id ??\n input.medium?.id ??\n input.mediumId ??\n input.material?.mediumId,\n 0\n ),\n medium,\n color: Object.freeze(color),\n emission: Object.freeze(emission),\n roughness: clamp(readFiniteNumber(\"roughness\", input.roughness ?? input.material?.roughness, 0.72), 0, 1),\n metallic: clamp(readFiniteNumber(\"metallic\", input.metallic ?? input.material?.metallic, 0), 0, 1),\n opacity,\n ior: clamp(readFiniteNumber(\"ior\", input.ior ?? input.material?.ior, materialExtensions.ior), 1, 3),\n sheen: clamp(readFiniteNumber(\"sheen\", input.sheen ?? input.material?.sheen, 0), 0, 1),\n sheenTint: clamp(readFiniteNumber(\"sheenTint\", input.sheenTint ?? input.material?.sheenTint, 0), 0, 1),\n sheenColor: Object.freeze(sheenColor),\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", input.clearcoat ?? input.material?.clearcoat, materialExtensions.clearcoat), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n materialExtensions.clearcoatRoughness\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, materialExtensions.specular), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: Math.max(normalizeWavefrontThickness(input, \"mesh thickness\"), materialExtensions.volumeThickness),\n transmission,\n materialExtensions,\n baseColorTexture: input.baseColorTexture ?? input.material?.baseColorTexture ?? null,\n metallicRoughnessTexture:\n input.metallicRoughnessTexture ?? input.material?.metallicRoughnessTexture ?? null,\n normalTexture: input.normalTexture ?? input.material?.normalTexture ?? null,\n occlusionTexture: input.occlusionTexture ?? input.material?.occlusionTexture ?? null,\n emissiveTexture: input.emissiveTexture ?? input.material?.emissiveTexture ?? null,\n extensionTextures: materialExtensions.textures,\n });\n}\n\nexport function normalizeSceneObjects(sceneObjects, useDefaultScene = true) {\n const source =\n Array.isArray(sceneObjects) && sceneObjects.length > 0\n ? sceneObjects\n : useDefaultScene\n ? createDefaultWavefrontSceneObjects()\n : [];\n return source.map((object, index) => normalizeWavefrontSceneObject(object, index));\n}\n\nexport function normalizeWavefrontMeshes(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\n return source.map((mesh, index) => normalizeWavefrontMesh(mesh, index));\n}\n\nexport function normalizeMeshes(options = {}) {\n if (Array.isArray(options.meshes)) {\n return normalizeWavefrontMeshes(options.meshes);\n }\n if (options.mesh) {\n return normalizeWavefrontMeshes([options.mesh]);\n }\n return [];\n}\n","import {\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n GPU_MATERIAL_RECORD_BYTES,\n MATERIAL_EMISSIVE,\n MESH_RANGE_RECORD_BYTES,\n MESH_VERTEX_RECORD_BYTES,\n boundsCentroid,\n clamp,\n cross,\n emissionPower,\n mergeBounds,\n normalize,\n readNonNegativeInteger,\n readVector,\n readVector2,\n subtract,\n triangleBounds,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport { normalizeWavefrontMesh } from \"./wavefront-scene-normalizers.js\";\n\nfunction clampUnit(value) {\n return clamp(Number(value) || 0, 0, 1);\n}\n\nfunction createMeshTriangleRecords(meshes, gpuMaterialSource = null) {\n const source = Array.isArray(meshes) ? meshes : [];\n const resolvedMaterialSource = gpuMaterialSource ?? createWavefrontGpuMaterialSource(source);\n let nextTriangleId = 0;\n return source.flatMap((meshInput, meshIndex) => {\n const mesh = normalizeWavefrontMesh(meshInput, meshIndex);\n const triangles = [];\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const a = mesh.indices[index];\n const b = mesh.indices[index + 1];\n const c = mesh.indices[index + 2];\n const v0 = readVector(mesh.positions, a, 3, [0, 0, 0]);\n const v1 = readVector(mesh.positions, b, 3, [0, 0, 0]);\n const v2 = readVector(mesh.positions, c, 3, [0, 0, 0]);\n const faceNormal = normalize(cross(subtract(v1, v0), subtract(v2, v0)), [0, 1, 0]);\n const n0 = mesh.normals ? normalize(readVector(mesh.normals, a, 3, faceNormal), faceNormal) : faceNormal;\n const n1 = mesh.normals ? normalize(readVector(mesh.normals, b, 3, faceNormal), faceNormal) : faceNormal;\n const n2 = mesh.normals ? normalize(readVector(mesh.normals, c, 3, faceNormal), faceNormal) : faceNormal;\n const uv0 = mesh.uvs ? readVector2(mesh.uvs, a) : [0, 0];\n const uv1 = mesh.uvs ? readVector2(mesh.uvs, b) : [0, 0];\n const uv2 = mesh.uvs ? readVector2(mesh.uvs, c) : [0, 0];\n const bounds = triangleBounds(v0, v1, v2);\n\n triangles.push(\n Object.freeze({\n triangleId: nextTriangleId,\n meshId: mesh.id,\n materialKind: mesh.materialKind,\n flags: mesh.flags,\n materialRefId: mesh.materialRefId,\n mediumRefId: mesh.mediumRefId,\n materialSlot: meshIndex,\n v0: Object.freeze(v0),\n v1: Object.freeze(v1),\n v2: Object.freeze(v2),\n n0: Object.freeze(n0),\n n1: Object.freeze(n1),\n n2: Object.freeze(n2),\n uv0: Object.freeze(uv0),\n uv1: Object.freeze(uv1),\n uv2: Object.freeze(uv2),\n color: mesh.color,\n emission: mesh.emission,\n material: Object.freeze([\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]),\n materialResponse: Object.freeze([\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]),\n materialExtension: Object.freeze([\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]),\n materialExtension2: Object.freeze([\n mesh.materialExtensions?.dispersion ?? 0,\n mesh.materialExtensions?.iridescence ?? 0,\n mesh.materialExtensions?.iridescenceIor ?? 1.3,\n mesh.materialExtensions?.anisotropy ?? 0,\n ]),\n materialExtension3: Object.freeze([\n mesh.materialExtensions?.iridescenceThicknessMinimum ?? 100,\n mesh.materialExtensions?.iridescenceThicknessMaximum ?? 400,\n mesh.materialExtensions?.sheenRoughness ?? 0,\n mesh.materialExtensions?.anisotropyRotation ?? 0,\n ]),\n specularColor: Object.freeze([\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]),\n baseColorAtlas: Object.freeze(\n resolvedMaterialSource.baseColorAtlas.resolveRect(mesh.baseColorTexture)\n ),\n metallicRoughnessAtlas: Object.freeze(\n resolvedMaterialSource.metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n ),\n normalAtlas: Object.freeze(\n resolvedMaterialSource.normalAtlas.resolveRect(mesh.normalTexture)\n ),\n occlusionAtlas: Object.freeze(\n resolvedMaterialSource.occlusionAtlas.resolveRect(mesh.occlusionTexture)\n ),\n emissiveAtlas: Object.freeze(\n resolvedMaterialSource.emissiveAtlas.resolveRect(mesh.emissiveTexture)\n ),\n textureSettings: Object.freeze([\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]),\n extensionTextures: Object.freeze(\n Object.fromEntries(\n Object.entries(resolvedMaterialSource.extensionAtlases ?? {}).map(([name, atlas]) => [\n name,\n atlas.resolveRect(mesh.extensionTextures?.[name]),\n ])\n )\n ),\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n centroid: Object.freeze(boundsCentroid(bounds)),\n })\n );\n nextTriangleId += 1;\n }\n return triangles;\n });\n}\n\nfunction chooseSplitAxis(triangles) {\n const centroidBounds = triangles.reduce(\n (bounds, triangle) => {\n const pointBounds = { min: triangle.centroid, max: triangle.centroid };\n return mergeBounds(bounds, pointBounds);\n },\n null\n );\n const extent = subtract(centroidBounds.max, centroidBounds.min);\n if (extent[0] >= extent[1] && extent[0] >= extent[2]) {\n return 0;\n }\n return extent[1] >= extent[2] ? 1 : 2;\n}\n\nfunction buildBvh(triangles, maxLeafTriangles = 4) {\n if (triangles.length === 0) {\n return Object.freeze({ nodes: Object.freeze([]), triangles: Object.freeze([]) });\n }\n\n const nodes = [];\n const orderedTriangles = [];\n\n function buildNode(nodeTriangles) {\n const nodeIndex = nodes.length;\n nodes.push(null);\n const bounds = nodeTriangles.reduce((current, triangle) => mergeBounds(current, triangle.bounds), null);\n\n if (nodeTriangles.length <= maxLeafTriangles) {\n const firstTriangle = orderedTriangles.length;\n orderedTriangles.push(...nodeTriangles);\n nodes[nodeIndex] = Object.freeze({\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n firstTriangle,\n triangleCount: nodeTriangles.length,\n leftChild: 0,\n rightChild: 0,\n });\n return nodeIndex;\n }\n\n const axis = chooseSplitAxis(nodeTriangles);\n const sorted = [...nodeTriangles].sort((left, right) => left.centroid[axis] - right.centroid[axis]);\n const midpoint = Math.max(1, Math.floor(sorted.length / 2));\n const leftChild = buildNode(sorted.slice(0, midpoint));\n const rightChild = buildNode(sorted.slice(midpoint));\n nodes[nodeIndex] = Object.freeze({\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n firstTriangle: leftChild,\n triangleCount: 0,\n leftChild,\n rightChild,\n });\n return nodeIndex;\n }\n\n buildNode(triangles);\n return Object.freeze({\n nodes: Object.freeze(nodes),\n triangles: Object.freeze(orderedTriangles),\n });\n}\n\nexport function createWavefrontMeshAcceleration(meshes = [], gpuMaterialSource = null) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const resolvedMaterialSource = gpuMaterialSource ?? createWavefrontGpuMaterialSource(source);\n const triangles = createMeshTriangleRecords(source, resolvedMaterialSource);\n return buildBvh(triangles);\n}\n\nexport function estimateMeshSourceShape(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\n return source.reduce(\n (shape, meshInput, meshIndex) => {\n const mesh = normalizeWavefrontMesh(meshInput, meshIndex);\n return {\n vertexCount: shape.vertexCount + mesh.positions.length / 3,\n indexCount: shape.indexCount + mesh.indices.length,\n meshCount: shape.meshCount + 1,\n triangleCount: shape.triangleCount + mesh.indices.length / 3,\n };\n },\n {\n vertexCount: 0,\n indexCount: 0,\n meshCount: 0,\n triangleCount: 0,\n }\n );\n}\n\nexport function estimateBinaryBvhNodeCapacity(triangleCount) {\n return triangleCount <= 0 ? 0 : Math.max(1, triangleCount * 2 - 1);\n}\n\nfunction nextPowerOfTwo(value) {\n if (value <= 1) {\n return Math.max(0, value);\n }\n return 2 ** Math.ceil(Math.log2(value));\n}\n\nfunction textureComponentToByte(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return fallback;\n }\n if (numeric >= 0 && numeric <= 1) {\n return Math.max(0, Math.min(255, Math.round(numeric * 255)));\n }\n return Math.max(0, Math.min(255, Math.round(numeric)));\n}\n\nfunction createSolidTextureSample(width, height, rgba) {\n const data = new Uint8Array(width * height * 4);\n for (let offset = 0; offset < data.length; offset += 4) {\n data[offset] = rgba[0];\n data[offset + 1] = rgba[1];\n data[offset + 2] = rgba[2];\n data[offset + 3] = rgba[3];\n }\n return Object.freeze({\n width,\n height,\n data,\n });\n}\n\nfunction normalizeTextureSampleInput(texture, fallbackColor) {\n if (\n !texture ||\n !Number.isFinite(texture.width) ||\n !Number.isFinite(texture.height) ||\n texture.width <= 0 ||\n texture.height <= 0\n ) {\n return createSolidTextureSample(1, 1, fallbackColor);\n }\n\n const pixelCount = Math.trunc(texture.width) * Math.trunc(texture.height) * 4;\n const source =\n ArrayBuffer.isView(texture.data) || Array.isArray(texture.data) ? texture.data : null;\n if (!source || source.length < pixelCount) {\n return createSolidTextureSample(1, 1, fallbackColor);\n }\n\n const data = new Uint8Array(pixelCount);\n for (let index = 0; index < pixelCount; index += 1) {\n data[index] = textureComponentToByte(source[index], fallbackColor[index % 4]);\n }\n\n return Object.freeze({\n width: Math.trunc(texture.width),\n height: Math.trunc(texture.height),\n data,\n });\n}\n\nfunction buildTextureAtlas(textures, fallbackColor) {\n const padding = 1;\n const defaultTexture = createSolidTextureSample(1, 1, fallbackColor);\n const uniqueEntries = [{ source: null, texture: defaultTexture }];\n const bySource = new Map();\n\n for (const texture of Array.isArray(textures) ? textures : []) {\n if (!texture || bySource.has(texture)) {\n continue;\n }\n const normalized = normalizeTextureSampleInput(texture, fallbackColor);\n bySource.set(texture, uniqueEntries.length);\n uniqueEntries.push({ source: texture, texture: normalized });\n }\n\n const totalArea = uniqueEntries.reduce((sum, entry) => {\n return sum + (entry.texture.width + padding * 2) * (entry.texture.height + padding * 2);\n }, 0);\n const maxTileWidth = uniqueEntries.reduce((maxWidth, entry) => {\n return Math.max(maxWidth, entry.texture.width + padding * 2);\n }, 1);\n const targetWidth = Math.max(\n maxTileWidth,\n nextPowerOfTwo(Math.max(maxTileWidth, Math.ceil(Math.sqrt(totalArea))))\n );\n\n let cursorX = 0;\n let cursorY = 0;\n let rowHeight = 0;\n let atlasWidth = 0;\n const placements = uniqueEntries.map((entry) => {\n const tileWidth = entry.texture.width + padding * 2;\n const tileHeight = entry.texture.height + padding * 2;\n if (cursorX > 0 && cursorX + tileWidth > targetWidth) {\n cursorX = 0;\n cursorY += rowHeight;\n rowHeight = 0;\n }\n const placement = Object.freeze({\n x: cursorX,\n y: cursorY,\n tileWidth,\n tileHeight,\n width: entry.texture.width,\n height: entry.texture.height,\n });\n cursorX += tileWidth;\n atlasWidth = Math.max(atlasWidth, cursorX);\n rowHeight = Math.max(rowHeight, tileHeight);\n return placement;\n });\n\n const atlasHeight = Math.max(1, cursorY + rowHeight);\n const atlasData = new Uint8Array(Math.max(1, atlasWidth * atlasHeight * 4));\n\n const writePixel = (x, y, rgba) => {\n const offset = (y * atlasWidth + x) * 4;\n atlasData[offset] = rgba[0];\n atlasData[offset + 1] = rgba[1];\n atlasData[offset + 2] = rgba[2];\n atlasData[offset + 3] = rgba[3];\n };\n\n const rects = placements.map((placement, entryIndex) => {\n const { texture } = uniqueEntries[entryIndex];\n for (let y = 0; y < placement.tileHeight; y += 1) {\n for (let x = 0; x < placement.tileWidth; x += 1) {\n const sampleX = Math.max(0, Math.min(texture.width - 1, x - padding));\n const sampleY = Math.max(0, Math.min(texture.height - 1, y - padding));\n const sourceOffset = (sampleY * texture.width + sampleX) * 4;\n writePixel(placement.x + x, placement.y + y, texture.data.slice(sourceOffset, sourceOffset + 4));\n }\n }\n return Object.freeze([\n (placement.x + padding) / Math.max(1, atlasWidth),\n (placement.y + padding) / Math.max(1, atlasHeight),\n placement.width / Math.max(1, atlasWidth),\n placement.height / Math.max(1, atlasHeight),\n ]);\n });\n\n const rectBySource = new Map();\n uniqueEntries.forEach((entry, index) => {\n if (entry.source) {\n rectBySource.set(entry.source, rects[index]);\n }\n });\n\n return Object.freeze({\n width: Math.max(1, atlasWidth),\n height: Math.max(1, atlasHeight),\n data: atlasData,\n defaultRect: rects[0],\n resolveRect(texture) {\n return rectBySource.get(texture) ?? rects[0];\n },\n });\n}\n\nexport function createWavefrontGpuMaterialSource(meshes = []) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const baseColorAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.baseColorTexture),\n [255, 255, 255, 255]\n );\n const metallicRoughnessAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.metallicRoughnessTexture),\n [255, 255, 255, 255]\n );\n const normalAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.normalTexture),\n [128, 128, 255, 255]\n );\n const occlusionAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.occlusionTexture),\n [255, 255, 255, 255]\n );\n const emissiveAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.emissiveTexture),\n [255, 255, 255, 255]\n );\n const extensionTextureNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n const extensionAtlases = Object.freeze(\n Object.fromEntries(\n extensionTextureNames.map((name) => [\n name,\n buildTextureAtlas(\n normalized.map((mesh) => mesh.extensionTextures?.[name]),\n [255, 255, 255, 255]\n ),\n ])\n )\n );\n const bytes = new ArrayBuffer(Math.max(1, normalized.length) * GPU_MATERIAL_RECORD_BYTES);\n const floatView = new Float32Array(bytes);\n\n normalized.forEach((mesh, meshIndex) => {\n const byteOffset = meshIndex * GPU_MATERIAL_RECORD_BYTES;\n writeVec4(floatView, byteOffset, mesh.color);\n writeVec4(floatView, byteOffset + 16, mesh.emission);\n writeVec4(floatView, byteOffset + 32, [\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]);\n writeVec4(floatView, byteOffset + 48, [\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]);\n writeVec4(floatView, byteOffset + 64, [\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]);\n writeVec4(floatView, byteOffset + 80, [\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]);\n writeVec4(floatView, byteOffset + 96, baseColorAtlas.resolveRect(mesh.baseColorTexture));\n writeVec4(\n floatView,\n byteOffset + 112,\n metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n );\n writeVec4(floatView, byteOffset + 128, normalAtlas.resolveRect(mesh.normalTexture));\n writeVec4(floatView, byteOffset + 144, occlusionAtlas.resolveRect(mesh.occlusionTexture));\n writeVec4(floatView, byteOffset + 160, emissiveAtlas.resolveRect(mesh.emissiveTexture));\n writeVec4(floatView, byteOffset + 176, [\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]);\n });\n\n return Object.freeze({\n buffer: bytes,\n count: normalized.length,\n recordBytes: GPU_MATERIAL_RECORD_BYTES,\n records: Object.freeze(normalized),\n baseColorAtlas,\n metallicRoughnessAtlas,\n normalAtlas,\n occlusionAtlas,\n emissiveAtlas,\n extensionAtlases,\n });\n}\n\nexport function estimateBvhLeafSortCapacity(triangleCount) {\n return triangleCount <= 0 ? 0 : nextPowerOfTwo(triangleCount);\n}\n\nexport function createWavefrontBvhSortStages(itemCountInput) {\n const itemCount = readNonNegativeInteger(\"itemCount\", itemCountInput, 0);\n const sortCount = estimateBvhLeafSortCapacity(itemCount);\n if (sortCount <= 1) {\n return Object.freeze([]);\n }\n\n const stages = [];\n for (let sequenceSize = 2; sequenceSize <= sortCount; sequenceSize *= 2) {\n for (\n let compareDistance = sequenceSize / 2;\n compareDistance >= 1;\n compareDistance /= 2\n ) {\n stages.push(\n Object.freeze({\n compareDistance,\n sequenceSize,\n })\n );\n }\n }\n\n return Object.freeze(stages);\n}\n\nexport function createWavefrontBvhBuildLevels(triangleCountInput) {\n const triangleCount = readNonNegativeInteger(\"triangleCount\", triangleCountInput, 0);\n const internalCount = Math.max(0, triangleCount - 1);\n if (internalCount === 0) {\n return Object.freeze([]);\n }\n\n const levels = [];\n let depth = 0;\n while (Math.pow(2, depth) - 1 < internalCount) {\n depth += 1;\n }\n\n for (let level = depth - 1; level >= 0; level -= 1) {\n const start = Math.pow(2, level) - 1;\n const end = Math.min(Math.pow(2, level + 1) - 2, internalCount - 1);\n if (end >= start) {\n levels.push(\n Object.freeze({\n start,\n count: end - start + 1,\n })\n );\n }\n }\n\n return Object.freeze(levels);\n}\n\nexport function resolveAccelerationBuildMode(options = {}) {\n const requestedMode =\n options.accelerationBuildMode ?? (options.displayQuality === true ? \"cpu-upload\" : \"cpu-debug\");\n const mode = requestedMode === \"cpu-debug\" ? \"cpu-upload\" : requestedMode;\n if (mode !== \"gpu\" && mode !== \"cpu-upload\") {\n throw new Error(\n \"accelerationBuildMode must be either \\\"gpu\\\", \\\"cpu-upload\\\", or the legacy alias \\\"cpu-debug\\\".\"\n );\n }\n return mode;\n}\n\nexport function createWavefrontGpuMeshSource(meshes = [], gpuMaterialSourceInput = null) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const gpuMaterialSource = gpuMaterialSourceInput ?? createWavefrontGpuMaterialSource(normalized);\n const vertexCount = normalized.reduce((count, mesh) => count + mesh.positions.length / 3, 0);\n const indexCount = normalized.reduce((count, mesh) => count + mesh.indices.length, 0);\n const triangleCount = Math.floor(indexCount / 3);\n const vertexBytes = new ArrayBuffer(Math.max(1, vertexCount) * MESH_VERTEX_RECORD_BYTES);\n const indexBytes = new ArrayBuffer(Math.max(1, indexCount) * 4);\n const meshBytes = new ArrayBuffer(Math.max(1, normalized.length) * MESH_RANGE_RECORD_BYTES);\n const vertexFloats = new Float32Array(vertexBytes);\n const indexUints = new Uint32Array(indexBytes);\n const meshUints = new Uint32Array(meshBytes);\n const meshFloats = new Float32Array(meshBytes);\n\n let vertexCursor = 0;\n let indexCursor = 0;\n let triangleCursor = 0;\n\n normalized.forEach((mesh, meshIndex) => {\n const meshVertexBase = vertexCursor;\n const meshIndexBase = indexCursor;\n const meshTriangleBase = triangleCursor;\n const meshVertexCount = mesh.positions.length / 3;\n\n for (let vertexIndex = 0; vertexIndex < meshVertexCount; vertexIndex += 1) {\n const recordOffset = (vertexCursor + vertexIndex) * (MESH_VERTEX_RECORD_BYTES / 4);\n const position = readVector(mesh.positions, vertexIndex, 3, [0, 0, 0]);\n const normal = mesh.normals ? readVector(mesh.normals, vertexIndex, 3, [0, 0, 0]) : [0, 0, 0];\n const uv = mesh.uvs ? readVector2(mesh.uvs, vertexIndex) : [0, 0];\n vertexFloats[recordOffset] = position[0];\n vertexFloats[recordOffset + 1] = position[1];\n vertexFloats[recordOffset + 2] = position[2];\n vertexFloats[recordOffset + 3] = 1;\n vertexFloats[recordOffset + 4] = normal[0];\n vertexFloats[recordOffset + 5] = normal[1];\n vertexFloats[recordOffset + 6] = normal[2];\n vertexFloats[recordOffset + 7] = mesh.normals ? 1 : 0;\n vertexFloats[recordOffset + 8] = uv[0];\n vertexFloats[recordOffset + 9] = uv[1];\n vertexFloats[recordOffset + 10] = mesh.uvs ? 1 : 0;\n vertexFloats[recordOffset + 11] = 0;\n }\n\n mesh.indices.forEach((indexValue, localIndex) => {\n indexUints[indexCursor + localIndex] = meshVertexBase + indexValue;\n });\n\n const meshOffset = meshIndex * (MESH_RANGE_RECORD_BYTES / 4);\n meshUints[meshOffset] = mesh.id;\n meshUints[meshOffset + 1] = mesh.materialKind;\n meshUints[meshOffset + 2] = mesh.flags;\n meshUints[meshOffset + 3] = mesh.materialRefId;\n meshUints[meshOffset + 4] = mesh.mediumRefId;\n meshUints[meshOffset + 5] = meshIndexBase;\n meshUints[meshOffset + 6] = mesh.indices.length;\n meshUints[meshOffset + 7] = meshTriangleBase;\n meshUints[meshOffset + 8] = mesh.indices.length / 3;\n meshUints[meshOffset + 9] = meshVertexBase;\n meshUints[meshOffset + 10] = meshVertexCount;\n meshUints[meshOffset + 11] = meshIndex;\n const floatOffset = meshOffset;\n writeVec4(meshFloats, floatOffset * 4 + 48, mesh.color);\n writeVec4(meshFloats, floatOffset * 4 + 64, mesh.emission);\n writeVec4(meshFloats, floatOffset * 4 + 80, [\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 96, [\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 112, [\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 128, [\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]);\n writeVec4(\n meshFloats,\n floatOffset * 4 + 144,\n gpuMaterialSource.baseColorAtlas.resolveRect(mesh.baseColorTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 160,\n gpuMaterialSource.metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 176,\n gpuMaterialSource.normalAtlas.resolveRect(mesh.normalTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 192,\n gpuMaterialSource.occlusionAtlas.resolveRect(mesh.occlusionTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 208,\n gpuMaterialSource.emissiveAtlas.resolveRect(mesh.emissiveTexture)\n );\n writeVec4(meshFloats, floatOffset * 4 + 224, [\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]);\n\n vertexCursor += meshVertexCount;\n indexCursor += mesh.indices.length;\n triangleCursor += mesh.indices.length / 3;\n });\n\n return Object.freeze({\n vertices: Object.freeze({\n buffer: vertexBytes,\n count: vertexCount,\n recordBytes: MESH_VERTEX_RECORD_BYTES,\n }),\n indices: Object.freeze({\n buffer: indexBytes,\n count: indexCount,\n recordBytes: 4,\n }),\n meshes: Object.freeze({\n buffer: meshBytes,\n records: Object.freeze(normalized),\n count: normalized.length,\n recordBytes: MESH_RANGE_RECORD_BYTES,\n }),\n triangleCount,\n bvhNodeCapacity: estimateBinaryBvhNodeCapacity(triangleCount),\n });\n}\n\nexport function createWavefrontEmissiveTriangleIndexSource(meshes = [], capacityInput) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const indices = [];\n let triangleCursor = 0;\n\n normalized.forEach((mesh) => {\n const triangleCount = Math.floor(mesh.indices.length / 3);\n const isEmissive =\n mesh.materialKind === MATERIAL_EMISSIVE || emissionPower(mesh.emission) > 0.0001;\n if (isEmissive) {\n for (let triangleOffset = 0; triangleOffset < triangleCount; triangleOffset += 1) {\n indices.push(triangleCursor + triangleOffset);\n }\n }\n triangleCursor += triangleCount;\n });\n\n const capacity = Math.max(\n indices.length,\n readNonNegativeInteger(\"emissiveTriangleCapacity\", capacityInput, indices.length)\n );\n const bytes = new ArrayBuffer(capacity * EMISSIVE_TRIANGLE_INDEX_BYTES);\n const uints = new Uint32Array(bytes);\n uints.fill(0xffffffff);\n indices.forEach((triangleIndex, index) => {\n uints[index] = triangleIndex;\n });\n\n return Object.freeze({\n buffer: bytes,\n indices: Object.freeze(indices),\n count: indices.length,\n capacity,\n recordBytes: EMISSIVE_TRIANGLE_INDEX_BYTES,\n });\n}\n","import {\n BVH_NODE_RECORD_BYTES,\n CONFIG_BUFFER_BYTES,\n COUNTER_DISPATCH_ARGS_OFFSET,\n HIT_TYPE_EMISSIVE,\n HIT_TYPE_SURFACE,\n MESH_RANGE_RECORD_BYTES,\n SCENE_OBJECT_RECORD_BYTES,\n TRIANGLE_RECORD_BYTES,\n clamp,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport { normalizeSceneObjects } from \"./wavefront-scene-data.js\";\n\nexport function packWavefrontSceneObjects(sceneObjects, capacity = sceneObjects.length) {\n const normalized =\n Array.isArray(sceneObjects) && sceneObjects.length === 0\n ? []\n : normalizeSceneObjects(sceneObjects);\n if (normalized.length > capacity) {\n throw new Error(\n `Scene object capacity ${capacity} is too small for ${normalized.length} objects.`\n );\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * SCENE_OBJECT_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n normalized.forEach((object, index) => {\n const byteOffset = index * SCENE_OBJECT_RECORD_BYTES;\n const u32 = byteOffset / 4;\n uintView[u32] = object.kind;\n uintView[u32 + 1] = object.id;\n uintView[u32 + 2] = object.materialKind;\n uintView[u32 + 3] = object.flags;\n uintView[u32 + 4] = object.mediumRefId;\n writeVec4(floatView, byteOffset + 32, [...object.center, 0]);\n writeVec4(floatView, byteOffset + 48, [...object.halfExtent, 0]);\n writeVec4(floatView, byteOffset + 64, object.color);\n writeVec4(floatView, byteOffset + 80, object.emission);\n writeVec4(floatView, byteOffset + 96, [\n object.roughness,\n object.metallic,\n object.opacity,\n object.ior,\n ]);\n writeVec4(floatView, byteOffset + 112, [\n object.sheenColor[0] ?? 0,\n object.sheenColor[1] ?? 0,\n object.sheenColor[2] ?? 0,\n object.clearcoat,\n ]);\n writeVec4(floatView, byteOffset + 128, [\n object.clearcoatRoughness,\n object.specular,\n object.transmission,\n object.thickness,\n ]);\n writeVec4(floatView, byteOffset + 144, [\n object.specularColor[0] ?? 1,\n object.specularColor[1] ?? 1,\n object.specularColor[2] ?? 1,\n 1,\n ]);\n });\n\n return Object.freeze({\n buffer: bytes,\n objects: Object.freeze(normalized),\n count: normalized.length,\n capacity,\n });\n}\n\nexport function packWavefrontTriangles(triangles, capacity = triangles.length) {\n if (triangles.length > capacity) {\n throw new Error(`Triangle capacity ${capacity} is too small for ${triangles.length} triangles.`);\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * TRIANGLE_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n triangles.forEach((triangle, index) => {\n const byteOffset = index * TRIANGLE_RECORD_BYTES;\n const u32 = byteOffset / 4;\n uintView[u32] = triangle.triangleId;\n uintView[u32 + 1] = triangle.meshId;\n uintView[u32 + 2] = triangle.materialKind;\n uintView[u32 + 3] = triangle.flags;\n uintView[u32 + 4] = triangle.materialRefId;\n uintView[u32 + 5] = triangle.mediumRefId;\n uintView[u32 + 6] = triangle.materialSlot ?? 0;\n uintView[u32 + 7] = 0;\n writeVec4(floatView, byteOffset + 32, [...triangle.v0, 0]);\n writeVec4(floatView, byteOffset + 48, [...triangle.v1, 0]);\n writeVec4(floatView, byteOffset + 64, [...triangle.v2, 0]);\n writeVec4(floatView, byteOffset + 80, [...triangle.n0, 0]);\n writeVec4(floatView, byteOffset + 96, [...triangle.n1, 0]);\n writeVec4(floatView, byteOffset + 112, [...triangle.n2, 0]);\n writeVec4(floatView, byteOffset + 128, [...triangle.uv0, ...triangle.uv1]);\n writeVec4(floatView, byteOffset + 144, [...triangle.uv2, 0, 0]);\n writeVec4(floatView, byteOffset + 160, triangle.color);\n writeVec4(floatView, byteOffset + 176, triangle.emission);\n writeVec4(floatView, byteOffset + 192, triangle.material);\n writeVec4(floatView, byteOffset + 208, triangle.materialResponse);\n writeVec4(floatView, byteOffset + 224, triangle.materialExtension ?? [0.08, 1, 0, 0]);\n writeVec4(floatView, byteOffset + 240, triangle.specularColor ?? [1, 1, 1, 1]);\n writeVec4(floatView, byteOffset + 256, triangle.baseColorAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 272, triangle.metallicRoughnessAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 288, triangle.normalAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 304, triangle.occlusionAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 320, triangle.emissiveAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 336, triangle.textureSettings ?? [1, 1, 1, 0]);\n writeVec4(floatView, byteOffset + 352, triangle.materialExtension2 ?? [0, 0, 1.3, 0]);\n writeVec4(floatView, byteOffset + 368, triangle.materialExtension3 ?? [100, 400, 0, 0]);\n const extensionTextureNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n extensionTextureNames.forEach((name, extensionIndex) => {\n writeVec4(\n floatView,\n byteOffset + 384 + extensionIndex * 16,\n triangle.extensionTextures?.[name] ?? [0, 0, 1, 1]\n );\n });\n });\n\n return Object.freeze({\n buffer: bytes,\n triangles: Object.freeze(triangles),\n count: triangles.length,\n capacity,\n });\n}\n\nexport function packWavefrontBvhNodes(nodes, capacity = nodes.length) {\n if (nodes.length > capacity) {\n throw new Error(`BVH node capacity ${capacity} is too small for ${nodes.length} nodes.`);\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * BVH_NODE_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n nodes.forEach((node, index) => {\n const byteOffset = index * BVH_NODE_RECORD_BYTES;\n const u32 = byteOffset / 4;\n writeVec4(floatView, byteOffset, [...node.bounds.min, 0]);\n writeVec4(floatView, byteOffset + 16, [...node.bounds.max, 0]);\n uintView[u32 + 8] = node.triangleCount > 0 ? node.firstTriangle : node.leftChild;\n uintView[u32 + 9] = node.triangleCount;\n uintView[u32 + 10] = node.rightChild;\n uintView[u32 + 11] = 0;\n });\n\n return Object.freeze({\n buffer: bytes,\n nodes: Object.freeze(nodes),\n count: nodes.length,\n capacity,\n });\n}\n\nexport function createConfigPayload(config, tile, frameIndex, buildRange = {}) {\n const bytes = new ArrayBuffer(CONFIG_BUFFER_BYTES);\n const data = new DataView(bytes);\n const floatView = new Float32Array(bytes);\n const sampleIndex = buildRange.sampleIndex ?? 0;\n const sampleWeight = buildRange.sampleWeight ?? 1;\n data.setUint32(0, config.width, true);\n data.setUint32(4, config.height, true);\n data.setUint32(8, tile.x, true);\n data.setUint32(12, tile.y, true);\n data.setUint32(16, tile.width, true);\n data.setUint32(20, tile.height, true);\n data.setUint32(24, tile.width * tile.height, true);\n data.setUint32(28, config.maxDepth, true);\n data.setUint32(32, config.sceneObjectCount, true);\n data.setUint32(36, frameIndex, true);\n data.setUint32(40, config.denoise ? 1 : 0, true);\n data.setUint32(44, config.triangleCount, true);\n data.setUint32(48, config.bvhNodeCount, true);\n data.setUint32(52, config.displayQuality ? 1 : 0, true);\n data.setUint32(56, config.gpuMeshSource.meshes.count, true);\n data.setUint32(60, config.bvhNodeCapacity, true);\n writeVec4(floatView, 64, [...config.camera.position, 1]);\n writeVec4(floatView, 80, [...config.camera.forward, 0]);\n writeVec4(floatView, 96, [...config.camera.right, 0]);\n writeVec4(floatView, 112, [...config.camera.up, 0]);\n writeVec4(floatView, 128, [\n config.camera.tanHalfFovY,\n config.camera.aspect,\n sampleWeight,\n sampleIndex,\n ]);\n writeVec4(floatView, 144, config.environmentColor);\n writeVec4(floatView, 160, config.ambientColor);\n writeVec4(floatView, 176, config.environmentLighting.horizonColor);\n writeVec4(floatView, 192, config.environmentLighting.zenithColor);\n writeVec4(floatView, 208, [\n ...config.environmentLighting.sunDirection,\n config.environmentLighting.intensity,\n ]);\n writeVec4(floatView, 224, config.environmentLighting.sunColor);\n data.setUint32(240, buildRange.start ?? 0, true);\n data.setUint32(244, buildRange.count ?? 0, true);\n data.setUint32(248, buildRange.sortItemCount ?? 0, true);\n data.setUint32(252, config.emissiveTriangleCount ?? 0, true);\n data.setUint32(256, config.environmentPortalCount ?? 0, true);\n data.setUint32(260, config.environmentPortalMode ?? 0, true);\n data.setUint32(264, config.samplesPerPixel, true);\n data.setUint32(268, config.transportExperimentFlags ?? 0, true);\n writeVec4(floatView, 272, [\n config.environmentMap.enabled ? 1 : 0,\n config.environmentMap.intensity,\n config.environmentMap.rotationRadians,\n config.environmentMap.ambientStrength,\n ]);\n writeVec4(floatView, 288, [\n config.deferredPathResolve ? 1 : 0,\n config.environmentLighting.sunlitBaseline,\n config.strictPhysicalLowSppLighting ? 1 : 0,\n config.presentationOutput === \"linear\" ? 1 : 0,\n ]);\n writeVec4(floatView, 304, [\n config.environmentMap.width ?? 1,\n config.environmentMap.height ?? 1,\n config.environmentMap.mipLevelCount ?? 1,\n config.environmentMap.hasImportanceData ? 1 : 0,\n ]);\n return bytes;\n}\n\nexport function createTiles(width, height, tileSize) {\n const tiles = [];\n for (let y = 0; y < height; y += tileSize) {\n for (let x = 0; x < width; x += tileSize) {\n tiles.push(\n Object.freeze({\n x,\n y,\n width: Math.min(tileSize, width - x),\n height: Math.min(tileSize, height - y),\n })\n );\n }\n }\n return Object.freeze(tiles);\n}\n","import { recordDirectDispatch } from \"./wavefront-frame-runtime.js\";\nimport { createConfigPayload } from \"./wavefront-packers.js\";\nimport { WORKGROUP_SIZE } from \"./wavefront-core.js\";\n\nexport function dispatchWavefrontGpuAccelerationBuild({\n config,\n accelerationBuilt,\n tiles,\n device,\n bvhBuildConfigBuffer,\n configBufferStride,\n bvhBuildBindGroup,\n pipelines,\n parallelism,\n frameIndex,\n}) {\n if (!config.gpuAccelerationBuildRequired || accelerationBuilt) {\n return false;\n }\n const buildTile = tiles[0] ?? { x: 0, y: 0, width: 1, height: 1 };\n const encoder = device.createCommandEncoder({\n label: `plasius.wavefront.buildAcceleration.${frameIndex}`,\n });\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n 0,\n createConfigPayload(config, buildTile, frameIndex, {\n sortItemCount: config.bvhLeafSortCapacity,\n })\n );\n config.bvhSortStages.forEach((sortStage, stageIndex) => {\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n (stageIndex + 1) * configBufferStride,\n createConfigPayload(config, buildTile, frameIndex, {\n start: sortStage.compareDistance,\n count: sortStage.sequenceSize,\n sortItemCount: config.bvhLeafSortCapacity,\n })\n );\n });\n const buildLevelConfigStart = 1 + config.bvhSortStages.length;\n config.bvhBuildLevels.forEach((buildLevel, levelIndex) => {\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n (buildLevelConfigStart + levelIndex) * configBufferStride,\n createConfigPayload(config, buildTile, frameIndex, buildLevel)\n );\n });\n const passEncoder = encoder.beginComputePass({\n label: \"plasius.wavefront.buildAccelerationPass\",\n });\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [0]);\n passEncoder.setPipeline(pipelines.prepareMeshTrianglesAndLeaves);\n const prepareWorkgroups = Math.ceil(config.bvhLeafSortCapacity / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(prepareWorkgroups);\n recordDirectDispatch(parallelism, [prepareWorkgroups], WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.sortBvhLeafRefs);\n for (let stageIndex = 0; stageIndex < config.bvhSortStages.length; stageIndex += 1) {\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [\n (stageIndex + 1) * configBufferStride,\n ]);\n const sortWorkgroups = Math.ceil(config.bvhLeafSortCapacity / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(sortWorkgroups);\n recordDirectDispatch(parallelism, [sortWorkgroups], WORKGROUP_SIZE);\n }\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [0]);\n passEncoder.setPipeline(pipelines.writeSortedBvhLeaves);\n const leafWriteWorkgroups = Math.ceil(config.triangleCount / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(leafWriteWorkgroups);\n recordDirectDispatch(parallelism, [leafWriteWorkgroups], WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.buildBvhInternalLevel);\n for (let levelIndex = 0; levelIndex < config.bvhBuildLevels.length; levelIndex += 1) {\n const buildLevel = config.bvhBuildLevels[levelIndex];\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [\n (buildLevelConfigStart + levelIndex) * configBufferStride,\n ]);\n const levelWorkgroups = Math.ceil(buildLevel.count / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(levelWorkgroups);\n recordDirectDispatch(parallelism, [levelWorkgroups], WORKGROUP_SIZE);\n }\n passEncoder.end();\n device.queue.submit([encoder.finish()]);\n return true;\n}\n","import {\n ACCUMULATION_RECORD_BYTES,\n BVH_LEAF_REF_RECORD_BYTES,\n BVH_NODE_RECORD_BYTES,\n CONFIG_BUFFER_BYTES,\n COUNTER_BUFFER_BYTES,\n DEFAULT_AMBIENT_COLOR,\n DEFAULT_CAMERA,\n DEFAULT_ENVIRONMENT_COLOR,\n DEFAULT_ENVIRONMENT_LIGHTING,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY,\n DEFAULT_HEIGHT,\n DEFAULT_MAX_DEPTH,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION,\n DEFAULT_SAMPLES_PER_PIXEL,\n DEFAULT_SCENE_OBJECT_CAPACITY,\n DEFAULT_TILE_SIZE,\n DEFAULT_WIDTH,\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n EMPTY_TERMINATION_METRICS,\n ENVIRONMENT_PORTAL_RECORD_BYTES,\n HIT_RECORD_BYTES,\n INDIRECT_DISPATCH_ARGS_BYTES,\n MAX_PATH_TRACING_DEPTH,\n MAX_SAMPLES_PER_PIXEL,\n MESH_RANGE_RECORD_BYTES,\n MESH_VERTEX_RECORD_BYTES,\n PATH_VERTEX_RECORD_BYTES,\n RAY_RECORD_BYTES,\n SCENE_OBJECT_RECORD_BYTES,\n TRIANGLE_RECORD_BYTES,\n WORKGROUP_SIZE,\n add,\n asColor,\n asUnitVec3,\n asVec3,\n assertAnalyticDisplayQualityPolicy,\n clamp,\n cross,\n dot,\n normalize,\n readFiniteNumber,\n readNonNegativeInteger,\n readPositiveInteger,\n rendererWavefrontComputeMode,\n resolveDeferredPathResolve,\n resolveEnvironmentMap,\n resolveStrictPhysicalLowSppLighting,\n resolveTransportExperiments,\n resolveWavefrontPresentationOutput,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport {\n collectWavefrontMediums,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n estimateBinaryBvhNodeCapacity,\n estimateBvhLeafSortCapacity,\n estimateMeshSourceShape,\n normalizeMeshes,\n normalizeSceneObjects,\n resolveAccelerationBuildMode,\n} from \"./wavefront-scene-data.js\";\n\nconst WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 256;\n\nfunction allocatedRecordBytes(count, recordBytes) {\n return Math.max(1, count) * recordBytes;\n}\n\nfunction alignByteSize(value, alignment) {\n return Math.ceil(value / alignment) * alignment;\n}\n\nfunction resolveEnvironmentLighting(input, environmentColor, ambientColor) {\n const source = input ?? {};\n return Object.freeze({\n environmentColor: Object.freeze(asColor(source.environmentColor, environmentColor)),\n ambientColor: Object.freeze(asColor(source.ambientColor, ambientColor)),\n horizonColor: Object.freeze(asColor(source.horizonColor, environmentColor)),\n zenithColor: Object.freeze(asColor(source.zenithColor, DEFAULT_ENVIRONMENT_LIGHTING.zenithColor)),\n sunDirection: Object.freeze(asUnitVec3(source.sunDirection, DEFAULT_ENVIRONMENT_LIGHTING.sunDirection)),\n sunColor: Object.freeze(asColor(source.sunColor, DEFAULT_ENVIRONMENT_LIGHTING.sunColor)),\n intensity: Math.max(0.0001, readFiniteNumber(\"environmentLighting.intensity\", source.intensity, DEFAULT_ENVIRONMENT_LIGHTING.intensity)),\n mode: readNonNegativeInteger(\"environmentLighting.mode\", source.mode, DEFAULT_ENVIRONMENT_LIGHTING.mode),\n exposure: Math.max(0.0001, readFiniteNumber(\"environmentLighting.exposure\", source.exposure, DEFAULT_ENVIRONMENT_LIGHTING.exposure)),\n sunlitBaseline: Math.max(\n 0,\n readFiniteNumber(\n \"environmentLighting.sunlitBaseline\",\n source.sunlitBaseline ?? source.daylightBaseline,\n DEFAULT_ENVIRONMENT_LIGHTING.sunlitBaseline\n )\n ),\n });\n}\n\nfunction resolveEnvironmentPortalMode(value, hasPortals) {\n if (value === undefined || value === null) {\n return hasPortals ? 2 : 0;\n }\n if (Number.isInteger(value) && value >= 0 && value <= 2) {\n return value;\n }\n if (value === \"disabled\") {\n return 0;\n }\n if (value === \"guide\") {\n return 1;\n }\n if (value === \"guide-and-gate\" || value === \"gate\") {\n return 2;\n }\n throw new Error(\n \"environmentPortalMode must be disabled, guide, guide-and-gate, or an integer between 0 and 2.\"\n );\n}\n\nfunction orthogonalPortalTangent(normal) {\n if (Math.abs(normal[1]) < 0.92) {\n return normalize(cross([0, 1, 0], normal), [1, 0, 0]);\n }\n return normalize(cross([1, 0, 0], normal), [0, 0, 1]);\n}\n\nfunction resolvePortalTangent(value, normal) {\n const fallback = orthogonalPortalTangent(normal);\n const tangent = asUnitVec3(value, fallback);\n const projected = subtract(tangent, scale(normal, dot(tangent, normal)));\n return normalize(projected, fallback);\n}\n\nfunction readPositiveFiniteNumber(name, value, fallback) {\n const numeric = readFiniteNumber(name, value, fallback);\n if (numeric <= 0) {\n throw new Error(`${name} must be a positive finite number.`);\n }\n return numeric;\n}\n\nfunction readPortalExtent(name, value, halfName, halfValue) {\n if (value !== undefined && value !== null) {\n return readPositiveFiniteNumber(name, value, 1);\n }\n return readPositiveFiniteNumber(halfName, halfValue, 0.5) * 2;\n}\n\nfunction normalizeEnvironmentPortal(portal, index) {\n if (!portal || typeof portal !== \"object\") {\n throw new Error(`environmentPortals[${index}] must be an object.`);\n }\n const shape = portal.shape ?? portal.kind ?? \"rectangle\";\n if (shape !== \"rectangle\") {\n throw new Error(`environmentPortals[${index}].shape must be \"rectangle\".`);\n }\n const position = asVec3(portal.position ?? portal.center, [0, 0, 0]);\n const normal = asUnitVec3(portal.normal, [0, 0, 1]);\n const tangent = resolvePortalTangent(portal.tangent, normal);\n const bitangent = normalize(cross(normal, tangent), [0, 1, 0]);\n const width = readPortalExtent(\n `environmentPortals[${index}].width`,\n portal.width,\n `environmentPortals[${index}].halfWidth`,\n portal.halfWidth\n );\n const height = readPortalExtent(\n `environmentPortals[${index}].height`,\n portal.height,\n `environmentPortals[${index}].halfHeight`,\n portal.halfHeight\n );\n const radianceScale = Math.max(\n 0,\n readFiniteNumber(\n `environmentPortals[${index}].radianceScale`,\n portal.radianceScale ?? portal.intensity,\n 1\n )\n );\n return Object.freeze({\n kind: 1,\n flags: portal.twoSided === false ? 0 : 1,\n position: Object.freeze([position[0], position[1], position[2], width * height]),\n normal: Object.freeze([normal[0], normal[1], normal[2], radianceScale]),\n tangent: Object.freeze([tangent[0], tangent[1], tangent[2], width * 0.5]),\n bitangent: Object.freeze([bitangent[0], bitangent[1], bitangent[2], height * 0.5]),\n color: Object.freeze(asColor(portal.color, [1, 1, 1, 1])),\n });\n}\n\nfunction normalizeEnvironmentPortals(value) {\n if (value === undefined || value === null) {\n return Object.freeze([]);\n }\n if (!Array.isArray(value)) {\n throw new Error(\"environmentPortals must be an array when provided.\");\n }\n return Object.freeze(value.map(normalizeEnvironmentPortal));\n}\n\nexport function packEnvironmentPortals(portals, capacity) {\n const bytes = new ArrayBuffer(capacity * ENVIRONMENT_PORTAL_RECORD_BYTES);\n const data = new DataView(bytes);\n const floatView = new Float32Array(bytes);\n portals.forEach((portal, index) => {\n const byteOffset = index * ENVIRONMENT_PORTAL_RECORD_BYTES;\n const floatOffset = byteOffset / Float32Array.BYTES_PER_ELEMENT;\n data.setUint32(byteOffset, portal.kind, true);\n data.setUint32(byteOffset + 4, portal.flags, true);\n data.setUint32(byteOffset + 8, 0, true);\n data.setUint32(byteOffset + 12, 0, true);\n writeVec4(floatView, floatOffset + 4, portal.position);\n writeVec4(floatView, floatOffset + 8, portal.normal);\n writeVec4(floatView, floatOffset + 12, portal.tangent);\n writeVec4(floatView, floatOffset + 16, portal.bitangent);\n writeVec4(floatView, floatOffset + 20, portal.color);\n });\n return Object.freeze({\n buffer: bytes,\n portals,\n count: portals.length,\n capacity,\n recordBytes: ENVIRONMENT_PORTAL_RECORD_BYTES,\n });\n}\n\nfunction getCanvasDimension(canvas, key, fallback) {\n const value = Number(canvas?.[key]);\n if (Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n return fallback;\n}\n\nfunction resolveCamera(input, width, height) {\n const camera = input ?? DEFAULT_CAMERA;\n const position = asVec3(camera.position, DEFAULT_CAMERA.position);\n const target = asVec3(camera.target, DEFAULT_CAMERA.target);\n const upInput = normalize(asVec3(camera.up, DEFAULT_CAMERA.up), DEFAULT_CAMERA.up);\n const forward = normalize(subtract(target, position), [0, 0, -1]);\n const right = normalize(cross(forward, upInput), [1, 0, 0]);\n const up = normalize(cross(right, forward), [0, 1, 0]);\n const fovYDegrees = clamp(\n readFiniteNumber(\"camera.fovYDegrees\", camera.fovYDegrees ?? camera.fov, DEFAULT_CAMERA.fovYDegrees),\n 10,\n 120\n );\n const aspect = width / Math.max(1, height);\n const tanHalfFovY = Math.tan((fovYDegrees * Math.PI) / 360);\n\n return Object.freeze({\n position: Object.freeze(position),\n forward: Object.freeze(forward),\n right: Object.freeze(right),\n up: Object.freeze(up),\n fovYDegrees,\n aspect,\n tanHalfFovY,\n });\n}\n\nexport function estimateWavefrontPathTracingMemory(options = {}) {\n const width = readPositiveInteger(\"width\", options.width, DEFAULT_WIDTH);\n const height = readPositiveInteger(\"height\", options.height, DEFAULT_HEIGHT);\n const tileSize = readPositiveInteger(\"tileSize\", options.tileSize, DEFAULT_TILE_SIZE);\n const samplesPerPixel = clamp(\n readPositiveInteger(\n \"samplesPerPixel\",\n options.samplesPerPixel,\n DEFAULT_SAMPLES_PER_PIXEL\n ),\n 1,\n MAX_SAMPLES_PER_PIXEL\n );\n const tilePixelCapacity = readPositiveInteger(\n \"tilePixelCapacity\",\n options.tilePixelCapacity,\n DEFAULT_TILE_SIZE * DEFAULT_TILE_SIZE\n );\n const maxDepth = clamp(\n readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH),\n 1,\n MAX_PATH_TRACING_DEPTH\n );\n const sceneObjectCapacity = readPositiveInteger(\n \"sceneObjectCapacity\",\n options.sceneObjectCapacity,\n DEFAULT_SCENE_OBJECT_CAPACITY\n );\n const triangleCapacity = readNonNegativeInteger(\"triangleCapacity\", options.triangleCapacity, 0);\n const bvhNodeCapacity = readNonNegativeInteger(\"bvhNodeCapacity\", options.bvhNodeCapacity, 0);\n const bvhLeafSortCapacity = readNonNegativeInteger(\n \"bvhLeafSortCapacity\",\n options.bvhLeafSortCapacity,\n 0\n );\n const emissiveTriangleCapacity = readNonNegativeInteger(\n \"emissiveTriangleCapacity\",\n options.emissiveTriangleCapacity,\n 0\n );\n const environmentPortalCapacity = readNonNegativeInteger(\n \"environmentPortalCapacity\",\n options.environmentPortalCapacity,\n 0\n );\n readNonNegativeInteger(\"materialCapacity\", options.materialCapacity, 0);\n const meshVertexCount = readNonNegativeInteger(\n \"meshVertexCount\",\n options.meshVertexCount,\n 0\n );\n const meshIndexCount = readNonNegativeInteger(\n \"meshIndexCount\",\n options.meshIndexCount,\n 0\n );\n const meshRangeCount = readNonNegativeInteger(\n \"meshRangeCount\",\n options.meshRangeCount,\n 0\n );\n const bvhSortStageCount = readNonNegativeInteger(\n \"bvhSortStageCount\",\n options.bvhSortStageCount,\n 0\n );\n const bvhBuildLevelCount = readNonNegativeInteger(\n \"bvhBuildLevelCount\",\n options.bvhBuildLevelCount,\n 0\n );\n const minUniformBufferOffsetAlignment = readPositiveInteger(\n \"minUniformBufferOffsetAlignment\",\n options.minUniformBufferOffsetAlignment,\n WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT\n );\n const denoise = options.denoise !== false;\n const deferredPathResolve = options.deferredPathResolve !== false;\n const queueBytes = tilePixelCapacity * RAY_RECORD_BYTES;\n const hitBytes = tilePixelCapacity * HIT_RECORD_BYTES;\n const accumulationBytes = tilePixelCapacity * ACCUMULATION_RECORD_BYTES;\n const pathVertexBytes = tilePixelCapacity * (maxDepth + 1) * PATH_VERTEX_RECORD_BYTES;\n const sceneObjectBytes = sceneObjectCapacity * SCENE_OBJECT_RECORD_BYTES;\n const triangleBytes = allocatedRecordBytes(triangleCapacity, TRIANGLE_RECORD_BYTES);\n const materialTableBytes = 0;\n const bvhNodeBytes = bvhNodeCapacity * BVH_NODE_RECORD_BYTES;\n const bvhLeafReferenceBytes = allocatedRecordBytes(\n bvhLeafSortCapacity,\n BVH_LEAF_REF_RECORD_BYTES\n );\n const emissiveTriangleMetadataBytes =\n emissiveTriangleCapacity * BVH_NODE_RECORD_BYTES;\n const bvhCombinedBytes = allocatedRecordBytes(\n bvhNodeCapacity + emissiveTriangleCapacity,\n BVH_NODE_RECORD_BYTES\n );\n const meshVertexBytes = allocatedRecordBytes(meshVertexCount, MESH_VERTEX_RECORD_BYTES);\n const meshIndexBytes = allocatedRecordBytes(meshIndexCount, 4);\n const meshRangeBytes = allocatedRecordBytes(meshRangeCount, MESH_RANGE_RECORD_BYTES);\n const environmentPortalBytes = allocatedRecordBytes(\n environmentPortalCapacity,\n ENVIRONMENT_PORTAL_RECORD_BYTES\n );\n const tileCount = Math.ceil(width / tileSize) * Math.ceil(height / tileSize);\n const outputConfigSlotCount = deferredPathResolve ? 0 : tileCount;\n const frameConfigSlotCount = Math.max(\n 1,\n tileCount * samplesPerPixel + outputConfigSlotCount + (denoise ? 1 : 0)\n );\n const configBufferStride = alignByteSize(\n CONFIG_BUFFER_BYTES,\n minUniformBufferOffsetAlignment\n );\n const frameConfigBytes = frameConfigSlotCount * configBufferStride;\n const bvhBuildConfigBytes = Math.max(\n 1,\n 1 + bvhSortStageCount + bvhBuildLevelCount\n ) * configBufferStride;\n const sceneStorageBufferBindingBytes = Math.max(\n sceneObjectBytes,\n triangleBytes,\n bvhCombinedBytes,\n meshVertexBytes,\n meshIndexBytes,\n meshRangeBytes,\n environmentPortalBytes,\n bvhLeafReferenceBytes\n );\n const totalHotBufferBytes =\n queueBytes * 2 +\n hitBytes +\n accumulationBytes +\n pathVertexBytes +\n sceneObjectBytes +\n triangleBytes +\n bvhCombinedBytes +\n meshVertexBytes +\n meshIndexBytes +\n meshRangeBytes +\n bvhLeafReferenceBytes +\n environmentPortalBytes +\n frameConfigBytes +\n bvhBuildConfigBytes +\n COUNTER_BUFFER_BYTES +\n INDIRECT_DISPATCH_ARGS_BYTES;\n\n return Object.freeze({\n queueBytes,\n queuePairBytes: queueBytes * 2,\n hitBytes,\n accumulationBytes,\n pathVertexBytes,\n sceneObjectBytes,\n triangleBytes,\n materialTableBytes,\n bvhNodeBytes,\n bvhCombinedBytes,\n bvhLeafReferenceBytes,\n emissiveTriangleMetadataBytes,\n meshVertexBytes,\n meshIndexBytes,\n meshRangeBytes,\n environmentPortalBytes,\n configBytes: CONFIG_BUFFER_BYTES,\n configBufferStride,\n frameConfigBytes,\n bvhBuildConfigBytes,\n counterBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n sceneStorageBufferBindingBytes,\n totalHotBufferBytes,\n });\n}\n\nexport function estimateWavefrontPathTracingMemoryForConfig(config, limits = {}) {\n return estimateWavefrontPathTracingMemory({\n width: config.width,\n height: config.height,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n tilePixelCapacity: config.tilePixelCapacity,\n maxDepth: config.maxDepth,\n sceneObjectCapacity: config.sceneObjectCapacity,\n triangleCapacity: config.triangleCapacity,\n bvhNodeCapacity: config.bvhNodeCapacity,\n bvhLeafSortCapacity: config.bvhLeafSortCapacity,\n emissiveTriangleCapacity: config.emissiveTriangleCapacity,\n environmentPortalCapacity: config.environmentPortalCapacity,\n meshVertexCount: config.gpuMeshSource.vertices.count,\n meshIndexCount: config.gpuMeshSource.indices.count,\n meshRangeCount: config.gpuMeshSource.meshes.count,\n bvhSortStageCount: config.bvhSortStages.length,\n bvhBuildLevelCount: config.bvhBuildLevels.length,\n denoise: config.denoise,\n deferredPathResolve: config.deferredPathResolve,\n minUniformBufferOffsetAlignment:\n limits.minUniformBufferOffsetAlignment ??\n WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT,\n });\n}\n\nexport function createWavefrontPathTracingComputeConfig(options = {}) {\n assertAnalyticDisplayQualityPolicy(options);\n const accelerationBuildMode = resolveAccelerationBuildMode(options);\n const canvas = options.canvas;\n const width = readPositiveInteger(\"width\", options.width, getCanvasDimension(canvas, \"width\", DEFAULT_WIDTH));\n const height = readPositiveInteger(\"height\", options.height, getCanvasDimension(canvas, \"height\", DEFAULT_HEIGHT));\n const maxDepth = clamp(\n readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH),\n 1,\n MAX_PATH_TRACING_DEPTH\n );\n const tileSize = clamp(readPositiveInteger(\"tileSize\", options.tileSize, DEFAULT_TILE_SIZE), 16, 512);\n const samplesPerPixel = clamp(\n readPositiveInteger(\"samplesPerPixel\", options.samplesPerPixel, DEFAULT_SAMPLES_PER_PIXEL),\n 1,\n MAX_SAMPLES_PER_PIXEL\n );\n const maxFramePassesPerSubmission = clamp(\n readPositiveInteger(\n \"maxFramePassesPerSubmission\",\n options.maxFramePassesPerSubmission,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION\n ),\n 1,\n 4096\n );\n const tilePixelCapacity = readPositiveInteger(\n \"tilePixelCapacity\",\n options.tilePixelCapacity,\n tileSize * tileSize\n );\n const meshes = normalizeMeshes(options);\n const meshSourceShape = estimateMeshSourceShape(meshes);\n const gpuMaterialSource =\n meshes.length > 0\n ? createWavefrontGpuMaterialSource(meshes)\n : createWavefrontGpuMaterialSource([]);\n const gpuMeshSource =\n meshes.length > 0\n ? createWavefrontGpuMeshSource(meshes, gpuMaterialSource)\n : createWavefrontGpuMeshSource([]);\n const meshAcceleration =\n accelerationBuildMode === \"cpu-upload\"\n ? createWavefrontMeshAcceleration(meshes, gpuMaterialSource)\n : Object.freeze({ nodes: Object.freeze([]), triangles: Object.freeze([]) });\n const emissiveTriangleIndices = createWavefrontEmissiveTriangleIndexSource(\n meshes,\n options.emissiveTriangleCapacity\n );\n const triangleCount =\n accelerationBuildMode === \"gpu\"\n ? meshSourceShape.triangleCount\n : meshAcceleration.triangles.length;\n const bvhNodeCount =\n accelerationBuildMode === \"gpu\"\n ? estimateBinaryBvhNodeCapacity(triangleCount)\n : meshAcceleration.nodes.length;\n const sceneObjects = Object.freeze(\n normalizeSceneObjects(options.sceneObjects, meshes.length === 0)\n );\n const mediums = collectWavefrontMediums(options, meshes, sceneObjects);\n const sceneObjectCapacity = Math.max(\n sceneObjects.length,\n readPositiveInteger(\"sceneObjectCapacity\", options.sceneObjectCapacity, DEFAULT_SCENE_OBJECT_CAPACITY)\n );\n const triangleCapacity = Math.max(\n triangleCount,\n readNonNegativeInteger(\"triangleCapacity\", options.triangleCapacity, triangleCount)\n );\n const bvhNodeCapacity = Math.max(\n accelerationBuildMode === \"gpu\" ? estimateBinaryBvhNodeCapacity(triangleCount) : bvhNodeCount,\n readNonNegativeInteger(\n \"bvhNodeCapacity\",\n options.bvhNodeCapacity,\n accelerationBuildMode === \"gpu\" ? estimateBinaryBvhNodeCapacity(triangleCount) : bvhNodeCount\n )\n );\n const bvhLeafSortCapacity =\n accelerationBuildMode === \"gpu\" ? estimateBvhLeafSortCapacity(triangleCount) : 0;\n const bvhSortStages =\n accelerationBuildMode === \"gpu\"\n ? createWavefrontBvhSortStages(triangleCount)\n : Object.freeze([]);\n const bvhBuildLevels =\n accelerationBuildMode === \"gpu\"\n ? createWavefrontBvhBuildLevels(triangleCount)\n : Object.freeze([]);\n const camera = resolveCamera(options.camera, width, height);\n const environmentColor = Object.freeze(asColor(options.environmentColor, DEFAULT_ENVIRONMENT_COLOR));\n const ambientColor = Object.freeze(asColor(options.ambientColor, DEFAULT_AMBIENT_COLOR));\n const environmentLighting = resolveEnvironmentLighting(\n options.environmentLighting,\n environmentColor,\n ambientColor\n );\n const environmentPortals = normalizeEnvironmentPortals(\n options.environmentPortals ??\n options.environmentLightPortals ??\n options.environmentLighting?.environmentPortals\n );\n const environmentPortalCapacity = Math.max(\n environmentPortals.length,\n readNonNegativeInteger(\n \"environmentPortalCapacity\",\n options.environmentPortalCapacity,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY\n )\n );\n const environmentPortalMode = resolveEnvironmentPortalMode(\n options.environmentPortalMode ??\n options.portalMode ??\n options.environmentLighting?.environmentPortalMode,\n environmentPortals.length > 0\n );\n const environmentMap = resolveEnvironmentMap(\n options.environmentMap ??\n options.environmentTexture ??\n options.environmentLighting?.environmentMap\n );\n const deferredPathResolve = resolveDeferredPathResolve(options);\n const strictPhysicalLowSppLighting = resolveStrictPhysicalLowSppLighting(options);\n const transportExperiments = resolveTransportExperiments(options, strictPhysicalLowSppLighting);\n\n return Object.freeze({\n mode: rendererWavefrontComputeMode,\n width,\n height,\n maxDepth,\n tileSize,\n samplesPerPixel,\n maxFramePassesPerSubmission,\n tilePixelCapacity,\n sceneObjects,\n sceneObjectCount: sceneObjects.length,\n sceneObjectCapacity,\n mediums,\n mediumCount: mediums.length,\n accelerationBuildMode,\n gpuAccelerationBuildRequired: accelerationBuildMode === \"gpu\" && triangleCount > 0,\n gpuMeshSource,\n gpuMaterialSource,\n meshAcceleration,\n emissiveTriangleIndices,\n emissiveTriangleCount: emissiveTriangleIndices.count,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n triangleCount,\n triangleCapacity,\n bvhNodeCount,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n bvhSortStages,\n bvhBuildLevels,\n camera,\n environmentColor: environmentLighting.environmentColor,\n ambientColor: environmentLighting.ambientColor,\n environmentLighting,\n environmentPortals,\n environmentPortalCount: environmentPortals.length,\n environmentPortalCapacity,\n environmentPortalMode,\n environmentMap,\n deferredPathResolve,\n strictPhysicalLowSppLighting,\n transportExperiments,\n transportExperimentFlags: transportExperiments.bitmask,\n presentationOutput: resolveWavefrontPresentationOutput(options.presentationOutput),\n displayQuality: options.displayQuality === true,\n requiresMeshBvhForDisplayQuality: true,\n denoise: options.denoise !== false,\n frameIndex: readNonNegativeInteger(\"frameIndex\", options.frameIndex, 0),\n memory: estimateWavefrontPathTracingMemory({\n width,\n height,\n tileSize,\n samplesPerPixel,\n tilePixelCapacity,\n maxDepth,\n sceneObjectCapacity,\n triangleCapacity,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n environmentPortalCapacity,\n meshVertexCount: gpuMeshSource.vertices.count,\n meshIndexCount: gpuMeshSource.indices.count,\n meshRangeCount: gpuMeshSource.meshes.count,\n bvhSortStageCount: bvhSortStages.length,\n bvhBuildLevelCount: bvhBuildLevels.length,\n denoise: options.denoise !== false,\n deferredPathResolve,\n }),\n });\n}\n\nexport function supportsWavefrontPathTracingCompute(options = {}) {\n const navigatorRef = options.navigator ?? globalThis.navigator;\n return typeof navigatorRef?.gpu?.requestAdapter === \"function\";\n}\n","import {\n add,\n cross,\n dot,\n normalize,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\n\nexport function reflectVector(direction, normal) {\n return subtract(direction, scale(normal, 2 * dot(direction, normal)));\n}\n\nexport function buildOrthonormalBasis(normal) {\n const tangentFallback = Math.abs(normal[1]) < 0.999 ? [0, 1, 0] : [1, 0, 0];\n const tangent = normalize(cross(tangentFallback, normal), [1, 0, 0]);\n const bitangent = normalize(cross(normal, tangent), [0, 0, 1]);\n return { tangent, bitangent };\n}\n\nexport function localToWorld(local, normal) {\n const basis = buildOrthonormalBasis(normal);\n return normalize(\n add(\n add(scale(basis.tangent, local[0]), scale(basis.bitangent, local[1])),\n scale(normal, local[2])\n ),\n normal\n );\n}\n\nexport function radicalInverseVdc(bits) {\n let value = bits >>> 0;\n value = ((value << 16) | (value >>> 16)) >>> 0;\n value = (((value & 0x55555555) << 1) | ((value & 0xaaaaaaaa) >>> 1)) >>> 0;\n value = (((value & 0x33333333) << 2) | ((value & 0xcccccccc) >>> 2)) >>> 0;\n value = (((value & 0x0f0f0f0f) << 4) | ((value & 0xf0f0f0f0) >>> 4)) >>> 0;\n value = (((value & 0x00ff00ff) << 8) | ((value & 0xff00ff00) >>> 8)) >>> 0;\n return value * 2.3283064365386963e-10;\n}\n\nexport function hammersley(index, count) {\n return [index / Math.max(count, 1), radicalInverseVdc(index)];\n}\n\nexport function importanceSampleGgx(sample, roughness, normal) {\n const alpha = Math.max(roughness * roughness, 0.0001);\n const phi = 2 * Math.PI * sample[0];\n const cosTheta = Math.sqrt((1 - sample[1]) / (1 + (alpha * alpha - 1) * sample[1]));\n const sinTheta = Math.sqrt(Math.max(0, 1 - cosTheta * cosTheta));\n const halfVector = localToWorld(\n [Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta],\n normal\n );\n return normalize(halfVector, normal);\n}\n\nexport function distributionGgx(nDotH, roughness) {\n const alpha = Math.max(roughness * roughness, 0.0001);\n const alpha2 = alpha * alpha;\n const denom = (nDotH * nDotH) * (alpha2 - 1) + 1;\n return alpha2 / Math.max(Math.PI * denom * denom, 0.000001);\n}\n\nexport function geometrySchlickGgx(nDotV, roughness) {\n const k = ((roughness + 1) * (roughness + 1)) / 8;\n return nDotV / Math.max(nDotV * (1 - k) + k, 0.000001);\n}\n\nexport function geometrySmith(nDotV, nDotL, roughness) {\n return geometrySchlickGgx(nDotV, roughness) * geometrySchlickGgx(nDotL, roughness);\n}\n\nexport function integrateBrdfSample(nDotV, roughness, sampleCount) {\n const viewDirection = [Math.sqrt(Math.max(0, 1 - nDotV * nDotV)), 0, nDotV];\n const normal = [0, 0, 1];\n let scaleTerm = 0;\n let biasTerm = 0;\n for (let index = 0; index < sampleCount; index += 1) {\n const xi = hammersley(index, sampleCount);\n const halfVector = importanceSampleGgx(xi, roughness, normal);\n const vDotH = Math.max(dot(viewDirection, halfVector), 0);\n const lightDirection = normalize(\n subtract(scale(halfVector, 2 * vDotH), viewDirection),\n normal\n );\n const nDotL = Math.max(lightDirection[2], 0);\n const nDotH = Math.max(halfVector[2], 0);\n if (nDotL <= 0 || nDotH <= 0 || vDotH <= 0) {\n continue;\n }\n const geometry = geometrySmith(nDotV, nDotL, roughness);\n const visibility = (geometry * vDotH) / Math.max(nDotH * nDotV, 0.000001);\n const fresnel = (1 - vDotH) ** 5;\n scaleTerm += (1 - fresnel) * visibility;\n biasTerm += fresnel * visibility;\n }\n return [scaleTerm / sampleCount, biasTerm / sampleCount];\n}\n","import {\n BRDF_LUT_UPLOAD_CACHE,\n DEFAULT_BRDF_LUT_SAMPLE_COUNT,\n DEFAULT_BRDF_LUT_SIZE,\n HIT_RECORD_BYTES,\n MEDIUM_TABLE_ROWS,\n PATH_VERTEX_RECORD_BYTES,\n RAY_RECORD_BYTES,\n} from \"./wavefront-core.js\";\nimport {\n add,\n clamp,\n dot,\n normalize,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n hammersley,\n importanceSampleGgx,\n integrateBrdfSample,\n} from \"./wavefront-sampling.js\";\n\nexport function clampTileSizeForDevice(config, device) {\n const limit = Number(device?.limits?.maxStorageBufferBindingSize);\n if (!Number.isFinite(limit) || limit <= 0) {\n return config.tileSize;\n }\n\n const maxPixelsByRay = Math.floor(limit / RAY_RECORD_BYTES);\n const maxPixelsByHit = Math.floor(limit / HIT_RECORD_BYTES);\n const maxPixelsByPathVertex = Math.floor(\n limit / ((config.maxDepth + 1) * PATH_VERTEX_RECORD_BYTES)\n );\n const maxPixels = Math.max(\n 256,\n Math.min(maxPixelsByRay, maxPixelsByHit, maxPixelsByPathVertex)\n );\n if (config.tilePixelCapacity <= maxPixels) {\n return config.tileSize;\n }\n\n return Math.max(16, Math.floor(Math.sqrt(maxPixels)));\n}\n\nexport function createBuffer(device, usage, size, label) {\n return device.createBuffer({\n label,\n size: Math.max(4, size),\n usage,\n });\n}\n\nexport function alignTo(value, alignment) {\n const resolvedAlignment = Math.max(1, alignment);\n return Math.ceil(value / resolvedAlignment) * resolvedAlignment;\n}\n\nfunction float32ToFloat16Bits(value) {\n const floatView = new Float32Array(1);\n const intView = new Uint32Array(floatView.buffer);\n floatView[0] = Number.isFinite(value) ? value : 0;\n const x = intView[0];\n const sign = (x >> 16) & 0x8000;\n let mantissa = x & 0x7fffff;\n let exponent = (x >> 23) & 0xff;\n\n if (exponent === 0xff) {\n return sign | (mantissa ? 0x7e00 : 0x7c00);\n }\n\n exponent = exponent - 127 + 15;\n if (exponent >= 0x1f) {\n return sign | 0x7c00;\n }\n if (exponent <= 0) {\n if (exponent < -10) {\n return sign;\n }\n mantissa = (mantissa | 0x800000) >> (1 - exponent);\n return sign | ((mantissa + 0x1000) >> 13);\n }\n return sign | (exponent << 10) | ((mantissa + 0x1000) >> 13);\n}\n\nfunction environmentMapIntegerScale(data) {\n if (data instanceof Uint8Array) {\n return 1 / 255;\n }\n if (data instanceof Uint16Array) {\n return 1 / 65535;\n }\n return 1;\n}\n\nfunction environmentMapHasSamplingData(environmentMap) {\n if (!environmentMap || !environmentMap.data) {\n return false;\n }\n const width = Math.max(1, environmentMap.width ?? 1);\n const height = Math.max(1, environmentMap.height ?? 1);\n return environmentMap.data.length >= width * height * 4;\n}\n\nfunction createRgba8TextureUpload(source) {\n const width = Math.max(1, Math.trunc(source.width));\n const height = Math.max(1, Math.trunc(source.height));\n const bytesPerRow = alignTo(width * 4, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\n for (let y = 0; y < height; y += 1) {\n const sourceOffset = y * width * 4;\n const targetOffset = y * bytesPerRow;\n bytes.set(data.subarray(sourceOffset, sourceOffset + width * 4), targetOffset);\n }\n return Object.freeze({\n bytes,\n bytesPerRow,\n width,\n height,\n });\n}\n\nfunction readEnvironmentMapComponent(data, index, fallback, integerScale = 1) {\n if (!data || index >= data.length) {\n return fallback;\n }\n const value = Number(data[index]);\n return Number.isFinite(value) ? Math.max(0, value) * integerScale : fallback;\n}\n\nfunction createBrdfLutUploadBytes(\n size = DEFAULT_BRDF_LUT_SIZE,\n sampleCount = DEFAULT_BRDF_LUT_SAMPLE_COUNT\n) {\n const cacheKey = `${Math.max(1, Math.trunc(size))}:${Math.max(1, Math.trunc(sampleCount))}`;\n const cached = BRDF_LUT_UPLOAD_CACHE.get(cacheKey);\n if (cached) {\n return cached;\n }\n const width = Math.max(1, Math.trunc(size));\n const height = Math.max(1, Math.trunc(size));\n const rowBytes = width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < height; y += 1) {\n const roughness = (y + 0.5) / height;\n for (let x = 0; x < width; x += 1) {\n const nDotV = Math.max((x + 0.5) / width, 0.0001);\n const [scaleTerm, biasTerm] = integrateBrdfSample(nDotV, roughness, sampleCount);\n const offset = y * bytesPerRow + x * 8;\n view.setUint16(offset, float32ToFloat16Bits(scaleTerm), true);\n view.setUint16(offset + 2, float32ToFloat16Bits(biasTerm), true);\n view.setUint16(offset + 4, float32ToFloat16Bits(0), true);\n view.setUint16(offset + 6, float32ToFloat16Bits(1), true);\n }\n }\n const upload = Object.freeze({ bytes, bytesPerRow, width, height });\n BRDF_LUT_UPLOAD_CACHE.set(cacheKey, upload);\n return upload;\n}\n\nfunction createLinearEnvironmentPixels(environmentMap, fallbackColor) {\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const pixels = new Float32Array(width * height * 4);\n const data = environmentMap.data;\n const integerScale = environmentMapIntegerScale(data);\n for (let index = 0; index < width * height; index += 1) {\n const sourceOffset = index * 4;\n const targetOffset = index * 4;\n pixels[targetOffset] = readEnvironmentMapComponent(data, sourceOffset, fallbackColor[0], integerScale);\n pixels[targetOffset + 1] = readEnvironmentMapComponent(data, sourceOffset + 1, fallbackColor[1], integerScale);\n pixels[targetOffset + 2] = readEnvironmentMapComponent(data, sourceOffset + 2, fallbackColor[2], integerScale);\n pixels[targetOffset + 3] = readEnvironmentMapComponent(data, sourceOffset + 3, fallbackColor[3] ?? 1, integerScale);\n }\n return pixels;\n}\n\nfunction environmentUvToDirection(u, v, rotationRadians = 0) {\n const angle = (u - rotationRadians / (2 * Math.PI) - 0.5) * 2 * Math.PI;\n const theta = v * Math.PI;\n const sinTheta = Math.sin(theta);\n return [\n Math.cos(angle) * sinTheta,\n Math.cos(theta),\n Math.sin(angle) * sinTheta,\n ];\n}\n\nfunction sampleEnvironmentPixelsBilinear(pixels, width, height, u, v) {\n const wrappedU = ((u % 1) + 1) % 1;\n const clampedV = clamp(v, 0, 1);\n const x = wrappedU * width - 0.5;\n const y = clampedV * height - 0.5;\n const x0 = ((Math.floor(x) % width) + width) % width;\n const y0 = clamp(Math.floor(y), 0, height - 1);\n const x1 = (x0 + 1) % width;\n const y1 = clamp(y0 + 1, 0, height - 1);\n const tx = x - Math.floor(x);\n const ty = y - Math.floor(y);\n const read = (px, py) => {\n const offset = (py * width + px) * 4;\n return [pixels[offset], pixels[offset + 1], pixels[offset + 2], pixels[offset + 3]];\n };\n const a = read(x0, y0);\n const b = read(x1, y0);\n const c = read(x0, y1);\n const d = read(x1, y1);\n const mixPair = (first, second, factor) => first * (1 - factor) + second * factor;\n return [\n mixPair(mixPair(a[0], b[0], tx), mixPair(c[0], d[0], tx), ty),\n mixPair(mixPair(a[1], b[1], tx), mixPair(c[1], d[1], tx), ty),\n mixPair(mixPair(a[2], b[2], tx), mixPair(c[2], d[2], tx), ty),\n mixPair(mixPair(a[3], b[3], tx), mixPair(c[3], d[3], tx), ty),\n ];\n}\n\nfunction directionToEnvironmentUv(direction, rotationRadians = 0) {\n const unitDirection = normalize(direction, [0, 1, 0]);\n const rotationTurns = rotationRadians / (2 * Math.PI);\n const u = ((((Math.atan2(unitDirection[2], unitDirection[0]) / (2 * Math.PI)) + 0.5 + rotationTurns) % 1) + 1) % 1;\n const v = Math.acos(clamp(unitDirection[1], -1, 1)) / Math.PI;\n return [u, clamp(v, 0, 1)];\n}\n\nfunction sampleEnvironmentRadiance(pixels, width, height, direction, rotationRadians = 0) {\n const [u, v] = directionToEnvironmentUv(direction, rotationRadians);\n return sampleEnvironmentPixelsBilinear(pixels, width, height, u, v);\n}\n\nfunction createFloat16RgbaUploadFromLevels(levels) {\n return levels.map((level) => {\n const rowBytes = level.width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * level.height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < level.height; y += 1) {\n for (let x = 0; x < level.width; x += 1) {\n const sourceOffset = (y * level.width + x) * 4;\n const targetOffset = y * bytesPerRow + x * 8;\n view.setUint16(targetOffset, float32ToFloat16Bits(level.data[sourceOffset]), true);\n view.setUint16(targetOffset + 2, float32ToFloat16Bits(level.data[sourceOffset + 1]), true);\n view.setUint16(targetOffset + 4, float32ToFloat16Bits(level.data[sourceOffset + 2]), true);\n view.setUint16(targetOffset + 6, float32ToFloat16Bits(level.data[sourceOffset + 3]), true);\n }\n }\n return Object.freeze({ bytes, bytesPerRow, width: level.width, height: level.height });\n });\n}\n\nfunction createPrefilteredEnvironmentLevels(environmentMap, fallbackColor) {\n const sourcePixels = createLinearEnvironmentPixels(environmentMap, fallbackColor);\n const sourceWidth = Math.max(1, environmentMap.width);\n const sourceHeight = Math.max(1, environmentMap.height);\n const mipLevelCount = Math.max(1, Math.floor(Math.log2(Math.max(sourceWidth, sourceHeight))) + 1);\n const levels = [\n Object.freeze({\n width: sourceWidth,\n height: sourceHeight,\n data: sourcePixels,\n }),\n ];\n for (let mipLevel = 1; mipLevel < mipLevelCount; mipLevel += 1) {\n const width = Math.max(1, sourceWidth >> mipLevel);\n const height = Math.max(1, sourceHeight >> mipLevel);\n const roughness = mipLevelCount <= 1 ? 0 : mipLevel / (mipLevelCount - 1);\n const data = new Float32Array(width * height * 4);\n const sampleCount = roughness < 0.25 ? 64 : roughness < 0.6 ? 96 : 128;\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const direction = environmentUvToDirection((x + 0.5) / width, (y + 0.5) / height, environmentMap.rotationRadians);\n const normal = normalize(direction, [0, 1, 0]);\n const viewDirection = normal;\n let totalWeight = 0;\n const accum = [0, 0, 0];\n for (let sampleIndex = 0; sampleIndex < sampleCount; sampleIndex += 1) {\n const xi = hammersley(sampleIndex, sampleCount);\n const halfVector = importanceSampleGgx(xi, roughness, normal);\n const viewDotHalf = Math.max(dot(viewDirection, halfVector), 0);\n const lightDirection = normalize(\n subtract(scale(halfVector, 2 * viewDotHalf), viewDirection),\n normal\n );\n const nDotL = Math.max(dot(normal, lightDirection), 0);\n if (nDotL <= 0.000001) {\n continue;\n }\n const radiance = sampleEnvironmentRadiance(\n sourcePixels,\n sourceWidth,\n sourceHeight,\n lightDirection,\n environmentMap.rotationRadians\n );\n accum[0] += radiance[0] * nDotL;\n accum[1] += radiance[1] * nDotL;\n accum[2] += radiance[2] * nDotL;\n totalWeight += nDotL;\n }\n const offset = (y * width + x) * 4;\n data[offset] = accum[0] / Math.max(totalWeight, 0.000001);\n data[offset + 1] = accum[1] / Math.max(totalWeight, 0.000001);\n data[offset + 2] = accum[2] / Math.max(totalWeight, 0.000001);\n data[offset + 3] = 1;\n }\n }\n levels.push(Object.freeze({ width, height, data }));\n }\n return Object.freeze({\n levels,\n mipLevelCount,\n width: sourceWidth,\n height: sourceHeight,\n });\n}\n\nfunction createEnvironmentSamplingTables(environmentMap, fallbackColor) {\n if (!environmentMapHasSamplingData(environmentMap)) {\n return Object.freeze({\n width: 1,\n height: 1,\n pdf: new Float32Array([1]),\n marginalCdf: new Float32Array([1]),\n conditionalCdf: new Float32Array([1]),\n hasImportanceData: false,\n });\n }\n const pixels = createLinearEnvironmentPixels(environmentMap, fallbackColor);\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const pdf = new Float32Array(width * height);\n const marginalCdf = new Float32Array(height);\n const conditionalCdf = new Float32Array(width * height);\n const rowSums = new Float32Array(height);\n let totalWeight = 0;\n for (let y = 0; y < height; y += 1) {\n const theta = ((y + 0.5) / height) * Math.PI;\n const sinTheta = Math.max(Math.sin(theta), 0.0001);\n let rowWeight = 0;\n for (let x = 0; x < width; x += 1) {\n const offset = (y * width + x) * 4;\n const luminance = pixels[offset] * 0.2126 + pixels[offset + 1] * 0.7152 + pixels[offset + 2] * 0.0722;\n const weight = Math.max(luminance * sinTheta, 0.000001);\n pdf[y * width + x] = weight;\n rowWeight += weight;\n conditionalCdf[y * width + x] = rowWeight;\n }\n rowSums[y] = rowWeight;\n totalWeight += rowWeight;\n if (rowWeight > 0) {\n for (let x = 0; x < width; x += 1) {\n conditionalCdf[y * width + x] /= rowWeight;\n }\n } else {\n for (let x = 0; x < width; x += 1) {\n conditionalCdf[y * width + x] = (x + 1) / width;\n }\n }\n marginalCdf[y] = totalWeight;\n }\n for (let y = 0; y < height; y += 1) {\n marginalCdf[y] /= Math.max(totalWeight, 0.000001);\n }\n for (let index = 0; index < pdf.length; index += 1) {\n pdf[index] /= Math.max(totalWeight, 0.000001);\n }\n return Object.freeze({\n width,\n height,\n pdf,\n marginalCdf,\n conditionalCdf,\n hasImportanceData: true,\n });\n}\n\nfunction createEnvironmentMapUploadBytes(environmentMap, fallbackColor) {\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const rowBytes = width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const data = environmentMap.data;\n const integerScale = environmentMapIntegerScale(data);\n const view = new DataView(bytes.buffer);\n const writeComponent = (targetOffset, sourceOffset, fallback) => {\n view.setUint16(\n targetOffset,\n float32ToFloat16Bits(\n readEnvironmentMapComponent(data, sourceOffset, fallback, integerScale)\n ),\n true\n );\n };\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const sourceOffset = (y * width + x) * 4;\n const targetOffset = y * bytesPerRow + x * 8;\n writeComponent(targetOffset, sourceOffset, fallbackColor[0]);\n writeComponent(targetOffset + 2, sourceOffset + 1, fallbackColor[1]);\n writeComponent(targetOffset + 4, sourceOffset + 2, fallbackColor[2]);\n writeComponent(targetOffset + 6, sourceOffset + 3, fallbackColor[3] ?? 1);\n }\n }\n\n const upload = Object.freeze({\n bytes,\n bytesPerRow,\n width,\n height,\n });\n return upload;\n}\n\nexport function createEnvironmentMapResource(device, constants, environmentMap, fallbackColor) {\n if (environmentMap.view) {\n return Object.freeze({\n view: environmentMap.view,\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture: null,\n ownsTexture: false,\n width: Math.max(1, environmentMap.width),\n height: Math.max(1, environmentMap.height),\n mipLevelCount: Math.max(1, environmentMap.mipLevelCount ?? 1),\n });\n }\n\n if (environmentMap.texture && typeof environmentMap.texture.createView === \"function\") {\n return Object.freeze({\n view: environmentMap.texture.createView(),\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture: environmentMap.texture,\n ownsTexture: false,\n width: Math.max(1, environmentMap.width),\n height: Math.max(1, environmentMap.height),\n mipLevelCount: Math.max(1, environmentMap.mipLevelCount ?? 1),\n });\n }\n\n const prefiltered = createPrefilteredEnvironmentLevels(environmentMap, fallbackColor);\n const uploads = createFloat16RgbaUploadFromLevels(prefiltered.levels);\n const texture = device.createTexture({\n label: environmentMap.enabled\n ? \"plasius.wavefront.environmentMap\"\n : \"plasius.wavefront.environmentMapFallback\",\n size: { width: prefiltered.width, height: prefiltered.height },\n format: \"rgba16float\",\n mipLevelCount: prefiltered.mipLevelCount,\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n uploads.forEach((upload, mipLevel) => {\n device.queue.writeTexture(\n { texture, mipLevel },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n });\n return Object.freeze({\n view: texture.createView(),\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture,\n ownsTexture: true,\n width: prefiltered.width,\n height: prefiltered.height,\n mipLevelCount: prefiltered.mipLevelCount,\n });\n}\n\nexport function createEnvironmentSamplingTextureResource(device, constants, environmentMap, fallbackColor) {\n const tables = createEnvironmentSamplingTables(environmentMap, fallbackColor);\n const rowBytes = tables.width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * tables.height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < tables.height; y += 1) {\n for (let x = 0; x < tables.width; x += 1) {\n const probability = tables.pdf[y * tables.width + x];\n const conditional = tables.conditionalCdf[y * tables.width + x];\n const marginal = tables.marginalCdf[y];\n const offset = y * bytesPerRow + x * 8;\n view.setUint16(offset, float32ToFloat16Bits(probability), true);\n view.setUint16(offset + 2, float32ToFloat16Bits(conditional), true);\n view.setUint16(offset + 4, float32ToFloat16Bits(marginal), true);\n view.setUint16(offset + 6, float32ToFloat16Bits(1), true);\n }\n }\n const texture = device.createTexture({\n label: \"plasius.wavefront.environmentSampling\",\n size: { width: tables.width, height: tables.height },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n bytes,\n { bytesPerRow, rowsPerImage: tables.height },\n { width: tables.width, height: tables.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n view: texture.createView(),\n texture,\n ownsTexture: true,\n hasImportanceData: tables.hasImportanceData,\n });\n}\n\nexport function createBrdfLutResource(device, constants, size = DEFAULT_BRDF_LUT_SIZE) {\n const upload = createBrdfLutUploadBytes(size);\n const texture = device.createTexture({\n label: \"plasius.wavefront.brdfLut\",\n size: { width: upload.width, height: upload.height },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n view: texture.createView(),\n sampler: device.createSampler({\n label: \"plasius.wavefront.brdfLutSampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n }),\n texture,\n ownsTexture: true,\n width: upload.width,\n height: upload.height,\n });\n}\n\nexport function createMediumTextureResource(device, constants, mediums) {\n const normalized = Array.isArray(mediums) && mediums.length > 0 ? mediums : [{ id: 0 }];\n const width = Math.max(\n 1,\n normalized.reduce((maximum, medium) => Math.max(maximum, medium.id ?? 0), 0) + 1\n );\n const level = {\n width,\n height: MEDIUM_TABLE_ROWS,\n data: new Float32Array(width * MEDIUM_TABLE_ROWS * 4),\n };\n\n for (const medium of normalized) {\n const mediumId = Math.max(0, Math.trunc(Number(medium.id) || 0));\n const absorptionOffset = mediumId * 4;\n level.data[absorptionOffset] = Math.max(0, medium.absorption?.[0] ?? 0);\n level.data[absorptionOffset + 1] = Math.max(0, medium.absorption?.[1] ?? 0);\n level.data[absorptionOffset + 2] = Math.max(0, medium.absorption?.[2] ?? 0);\n level.data[absorptionOffset + 3] = Math.max(0, medium.phaseModel ?? 0);\n\n const scatteringOffset = (width + mediumId) * 4;\n level.data[scatteringOffset] = Math.max(0, medium.scattering?.[0] ?? 0);\n level.data[scatteringOffset + 1] = Math.max(0, medium.scattering?.[1] ?? 0);\n level.data[scatteringOffset + 2] = Math.max(0, medium.scattering?.[2] ?? 0);\n level.data[scatteringOffset + 3] = Math.max(0, medium.density ?? 0);\n }\n\n const upload = createFloat16RgbaUploadFromLevels([level])[0];\n const texture = device.createTexture({\n label: \"plasius.wavefront.mediumTable\",\n size: { width, height: MEDIUM_TABLE_ROWS },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width, height: MEDIUM_TABLE_ROWS, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n texture,\n view: texture.createView(),\n ownsTexture: true,\n count: normalized.length,\n width,\n });\n}\n\nexport function mediumTablesEqual(left, right) {\n const leftMediums = Array.isArray(left) ? left : [];\n const rightMediums = Array.isArray(right) ? right : [];\n if (leftMediums.length !== rightMediums.length) {\n return false;\n }\n for (let index = 0; index < leftMediums.length; index += 1) {\n const leftMedium = leftMediums[index];\n const rightMedium = rightMediums[index];\n if ((leftMedium?.id ?? 0) !== (rightMedium?.id ?? 0)) {\n return false;\n }\n if ((leftMedium?.phaseModel ?? 0) !== (rightMedium?.phaseModel ?? 0)) {\n return false;\n }\n if ((leftMedium?.density ?? 0) !== (rightMedium?.density ?? 0)) {\n return false;\n }\n for (let component = 0; component < 3; component += 1) {\n if ((leftMedium?.absorption?.[component] ?? 0) !== (rightMedium?.absorption?.[component] ?? 0)) {\n return false;\n }\n if ((leftMedium?.scattering?.[component] ?? 0) !== (rightMedium?.scattering?.[component] ?? 0)) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport function createAtlasTextureResource(device, constants, atlas, label) {\n const upload = createRgba8TextureUpload(atlas);\n const texture = device.createTexture({\n label,\n size: { width: upload.width, height: upload.height },\n format: \"rgba8unorm\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n texture,\n view: texture.createView(),\n ownsTexture: true,\n });\n}\n","import { CONFIG_BUFFER_BYTES } from \"./wavefront-core.js\";\n\nexport function createWavefrontTraceBindGroup({\n device,\n traceBindGroupLayout,\n activeBuffer,\n nextBuffer,\n frameConfigBuffer,\n hitBuffer,\n accumulationBuffer,\n sceneObjectBuffer,\n counterBuffer,\n outputView,\n triangleBuffer,\n bvhNodeBuffer,\n radianceView,\n environmentPortalBuffer,\n environmentMapResource,\n pathVertexBuffer,\n baseColorAtlasResource,\n metallicRoughnessAtlasResource,\n normalAtlasResource,\n occlusionAtlasResource,\n emissiveAtlasResource,\n materialAtlasSampler,\n brdfLutResource,\n environmentSamplingResource,\n mediumTextureResource,\n extensionAtlasResources = {},\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: traceBindGroupLayout,\n entries: [\n { binding: 0, resource: { buffer: activeBuffer } },\n { binding: 1, resource: { buffer: nextBuffer } },\n { binding: 2, resource: { buffer: hitBuffer } },\n { binding: 3, resource: { buffer: accumulationBuffer } },\n { binding: 4, resource: { buffer: sceneObjectBuffer } },\n { binding: 5, resource: { buffer: frameConfigBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 6, resource: { buffer: counterBuffer } },\n { binding: 7, resource: outputView },\n { binding: 8, resource: { buffer: triangleBuffer } },\n { binding: 9, resource: { buffer: bvhNodeBuffer } },\n { binding: 16, resource: radianceView },\n { binding: 19, resource: { buffer: environmentPortalBuffer } },\n { binding: 20, resource: environmentMapResource.view },\n { binding: 21, resource: environmentMapResource.sampler },\n { binding: 22, resource: { buffer: pathVertexBuffer } },\n { binding: 23, resource: baseColorAtlasResource.view },\n { binding: 24, resource: metallicRoughnessAtlasResource.view },\n { binding: 25, resource: normalAtlasResource.view },\n { binding: 26, resource: occlusionAtlasResource.view },\n { binding: 27, resource: emissiveAtlasResource.view },\n { binding: 28, resource: materialAtlasSampler },\n { binding: 29, resource: brdfLutResource.view },\n { binding: 30, resource: brdfLutResource.sampler },\n { binding: 31, resource: environmentSamplingResource.view },\n { binding: 32, resource: mediumTextureResource.view },\n { binding: 33, resource: extensionAtlasResources.clearcoat.view },\n { binding: 34, resource: extensionAtlasResources.clearcoatRoughness.view },\n { binding: 35, resource: extensionAtlasResources.clearcoatNormal.view },\n { binding: 36, resource: extensionAtlasResources.transmission.view },\n { binding: 37, resource: extensionAtlasResources.thickness.view },\n { binding: 38, resource: extensionAtlasResources.sheenColor.view },\n { binding: 39, resource: extensionAtlasResources.sheenRoughness.view },\n { binding: 40, resource: extensionAtlasResources.specular.view },\n { binding: 41, resource: extensionAtlasResources.specularColor.view },\n { binding: 42, resource: extensionAtlasResources.iridescence.view },\n { binding: 43, resource: extensionAtlasResources.iridescenceThickness.view },\n { binding: 44, resource: extensionAtlasResources.anisotropy.view },\n ],\n });\n}\n\nexport function createWavefrontTraceBindGroups(options) {\n return [\n createWavefrontTraceBindGroup({\n ...options,\n activeBuffer: options.activeQueue,\n nextBuffer: options.nextQueue,\n label: \"plasius.wavefront.bind.activeNext\",\n }),\n createWavefrontTraceBindGroup({\n ...options,\n activeBuffer: options.nextQueue,\n nextBuffer: options.activeQueue,\n label: \"plasius.wavefront.bind.nextActive\",\n }),\n ];\n}\n\nexport function createWavefrontBvhBuildBindGroup({\n device,\n accelerationBindGroupLayout,\n bvhBuildConfigBuffer,\n triangleBuffer,\n bvhNodeBuffer,\n meshVertexBuffer,\n meshIndexBuffer,\n meshRangeBuffer,\n bvhLeafRefBuffer,\n}) {\n return device.createBindGroup({\n label: \"plasius.wavefront.bind.bvhBuild\",\n layout: accelerationBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: bvhBuildConfigBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 8, resource: { buffer: triangleBuffer } },\n { binding: 9, resource: { buffer: bvhNodeBuffer } },\n { binding: 10, resource: { buffer: meshVertexBuffer } },\n { binding: 11, resource: { buffer: meshIndexBuffer } },\n { binding: 12, resource: { buffer: meshRangeBuffer } },\n { binding: 13, resource: { buffer: bvhLeafRefBuffer } },\n ],\n });\n}\n\nfunction createWavefrontDenoiseRadianceBindGroup({\n device,\n denoiseRadianceBindGroupLayout,\n configBuffer,\n inputView,\n targetView,\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: denoiseRadianceBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: configBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 14, resource: inputView },\n { binding: 15, resource: targetView },\n ],\n });\n}\n\nfunction createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView,\n targetView,\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: denoiseResolveBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: configBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 17, resource: inputView },\n { binding: 18, resource: targetView },\n ],\n });\n}\n\nexport function createWavefrontDenoiseBindGroups({\n device,\n denoiseRadianceBindGroupLayout,\n denoiseResolveBindGroupLayout,\n configBuffer,\n radianceView,\n denoiseScratchView,\n outputView,\n}) {\n return Object.freeze({\n radiance: createWavefrontDenoiseRadianceBindGroup({\n device,\n denoiseRadianceBindGroupLayout,\n configBuffer,\n inputView: radianceView,\n targetView: denoiseScratchView,\n label: \"plasius.wavefront.bind.denoise.radianceToScratch\",\n }),\n resolve: createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView: denoiseScratchView,\n targetView: outputView,\n label: \"plasius.wavefront.bind.denoise.scratchToOutput\",\n }),\n directResolve: createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView: radianceView,\n targetView: outputView,\n label: \"plasius.wavefront.bind.denoise.radianceToOutput\",\n }),\n });\n}\n\nexport function createWavefrontPresentBindGroup({\n device,\n presentBindGroupLayout,\n outputView,\n sampler,\n}) {\n return device.createBindGroup({\n label: \"plasius.wavefront.presentBindGroup\",\n layout: presentBindGroupLayout,\n entries: [\n { binding: 0, resource: outputView },\n { binding: 1, resource: sampler },\n ],\n });\n}\n","import {\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n GPU_READBACK_COMPLETION_TIMEOUT_MS,\n GPU_SUBMITTED_WORK_TIMEOUT_MS,\n TRACE_SAMPLED_TEXTURE_BINDINGS,\n TRACE_STORAGE_BUFFER_BINDINGS,\n WORKGROUP_SIZE,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\n\nconst WEBGPU_DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE = 128 * 1024 * 1024;\nconst WEBGPU_DEFAULT_MAX_BUFFER_SIZE = 256 * 1024 * 1024;\n\nfunction readRequestedDeviceLimit(source, name) {\n const rawValue = source?.[name];\n if (rawValue === undefined || rawValue === null) {\n return 0;\n }\n const value = Number(rawValue);\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative safe integer.`);\n }\n return value;\n}\n\nfunction assertAdapterSupportsRequiredLimit(adapter, name, requiredValue) {\n const availableValue = Number(adapter?.limits?.[name]);\n if (!Number.isFinite(availableValue)) {\n throw new Error(\n `Wavefront scene buffers require ${name}>=${requiredValue} bytes, ` +\n \"but this adapter does not expose that limit.\"\n );\n }\n if (availableValue < requiredValue) {\n throw new Error(\n `Wavefront scene buffers require ${name}>=${requiredValue} bytes, ` +\n `but this adapter exposes ${availableValue} bytes.`\n );\n }\n}\n\nexport function getGpuUsageConstants() {\n if (\n typeof GPUBufferUsage === \"undefined\" ||\n typeof GPUTextureUsage === \"undefined\" ||\n typeof GPUShaderStage === \"undefined\"\n ) {\n throw new Error(\"WebGPU runtime unavailable. Required GPU constants are missing.\");\n }\n if (typeof GPUBufferUsage.INDIRECT !== \"number\") {\n throw new Error(\"WebGPU runtime unavailable. GPUBufferUsage.INDIRECT is missing.\");\n }\n\n return {\n buffer: GPUBufferUsage,\n texture: GPUTextureUsage,\n shader: GPUShaderStage,\n map: typeof GPUMapMode === \"undefined\" ? null : GPUMapMode,\n };\n}\n\nexport function resolveCanvas(canvasOrSelector, documentRef = globalThis.document) {\n if (typeof canvasOrSelector === \"string\") {\n const resolved = documentRef?.querySelector?.(canvasOrSelector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector: ${canvasOrSelector}`);\n }\n return resolved;\n }\n\n if (canvasOrSelector?.getContext) {\n return canvasOrSelector;\n }\n\n const fallback = documentRef?.querySelector?.(\"canvas[data-plasius-wavefront-path-tracing]\");\n if (!fallback) {\n throw new Error(\"A canvas is required for WebGPU wavefront path tracing.\");\n }\n return fallback;\n}\n\nasync function getPipelineDiagnostics(shaderModule) {\n if (typeof shaderModule?.getCompilationInfo !== \"function\") {\n return \"\";\n }\n try {\n const info = await shaderModule.getCompilationInfo();\n const messages = info.messages ?? [];\n if (messages.length === 0) {\n return \"\";\n }\n return messages\n .map((message) => {\n const line = message.lineNum ?? \"?\";\n const column = message.linePos ?? \"?\";\n return `line ${line}:${column} ${message.message}`;\n })\n .join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\nexport async function createComputePipeline(device, shaderModule, layout, entryPoint, label) {\n const descriptor = {\n label,\n layout,\n compute: {\n module: shaderModule,\n entryPoint,\n },\n };\n\n try {\n if (typeof device.createComputePipelineAsync === \"function\") {\n return await device.createComputePipelineAsync(descriptor);\n }\n return device.createComputePipeline(descriptor);\n } catch (error) {\n const diagnostics = await getPipelineDiagnostics(shaderModule);\n const suffix = diagnostics ? `\\n${diagnostics}` : \"\";\n throw new Error(`WGSL compilation failed for ${label}: ${error.message}${suffix}`, {\n cause: error,\n });\n }\n}\n\nexport async function assertShaderModuleCompiles(shaderModule, label) {\n if (typeof shaderModule?.getCompilationInfo !== \"function\") {\n return;\n }\n const info = await shaderModule.getCompilationInfo();\n const messages = Array.isArray(info?.messages) ? info.messages : [];\n const errors = messages.filter((message) => message?.type === \"error\");\n if (errors.length <= 0) {\n return;\n }\n const diagnostics = errors\n .map((message) => {\n const line = Number.isFinite(message.lineNum) ? message.lineNum : \"?\";\n const column = Number.isFinite(message.linePos) ? message.linePos : \"?\";\n return `line ${line}:${column} ${message.message}`;\n })\n .join(\"\\n\");\n throw new Error(`WGSL compilation preflight failed for ${label}:\\n${diagnostics}`);\n}\n\nexport async function createRenderPipeline(device, descriptor) {\n if (typeof device.createRenderPipelineAsync === \"function\") {\n return device.createRenderPipelineAsync(descriptor);\n }\n return device.createRenderPipeline(descriptor);\n}\n\nexport function createWavefrontDeviceDescriptor(adapter, options = {}, memory = null) {\n const descriptor = { ...(options.deviceDescriptor ?? {}) };\n const descriptorRequiredLimits = { ...(descriptor.requiredLimits ?? {}) };\n const requiredLimits = {\n ...descriptorRequiredLimits,\n ...(options.requiredLimits ?? {}),\n };\n const exposedStorageBufferLimit = Number(adapter?.limits?.maxStorageBuffersPerShaderStage);\n if (Number.isFinite(exposedStorageBufferLimit)) {\n if (exposedStorageBufferLimit < TRACE_STORAGE_BUFFER_BINDINGS) {\n throw new Error(\n `Wavefront mesh tracing requires maxStorageBuffersPerShaderStage>=${TRACE_STORAGE_BUFFER_BINDINGS}, ` +\n `but this adapter exposes ${exposedStorageBufferLimit}.`\n );\n }\n requiredLimits.maxStorageBuffersPerShaderStage = Math.max(\n Number(requiredLimits.maxStorageBuffersPerShaderStage ?? 0),\n TRACE_STORAGE_BUFFER_BINDINGS\n );\n }\n\n const exposedSampledTextureLimit = Number(adapter?.limits?.maxSampledTexturesPerShaderStage);\n if (Number.isFinite(exposedSampledTextureLimit)) {\n if (exposedSampledTextureLimit < TRACE_SAMPLED_TEXTURE_BINDINGS) {\n throw new Error(\n `Wavefront material tracing requires maxSampledTexturesPerShaderStage>=${TRACE_SAMPLED_TEXTURE_BINDINGS}, ` +\n `but this adapter exposes ${exposedSampledTextureLimit}.`\n );\n }\n requiredLimits.maxSampledTexturesPerShaderStage = Math.max(\n Number(requiredLimits.maxSampledTexturesPerShaderStage ?? 0),\n TRACE_SAMPLED_TEXTURE_BINDINGS\n );\n }\n\n const sceneStorageBufferBindingBytes = Number(\n memory?.sceneStorageBufferBindingBytes ?? 0\n );\n const requestedStorageBufferBindingSize = Math.max(\n readRequestedDeviceLimit(descriptorRequiredLimits, \"maxStorageBufferBindingSize\"),\n readRequestedDeviceLimit(options.requiredLimits, \"maxStorageBufferBindingSize\"),\n sceneStorageBufferBindingBytes > WEBGPU_DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE\n ? sceneStorageBufferBindingBytes\n : 0\n );\n if (requestedStorageBufferBindingSize > 0) {\n assertAdapterSupportsRequiredLimit(\n adapter,\n \"maxStorageBufferBindingSize\",\n requestedStorageBufferBindingSize\n );\n requiredLimits.maxStorageBufferBindingSize = requestedStorageBufferBindingSize;\n }\n\n const requestedMaxBufferSize = Math.max(\n readRequestedDeviceLimit(descriptorRequiredLimits, \"maxBufferSize\"),\n readRequestedDeviceLimit(options.requiredLimits, \"maxBufferSize\"),\n sceneStorageBufferBindingBytes > WEBGPU_DEFAULT_MAX_BUFFER_SIZE\n ? sceneStorageBufferBindingBytes\n : 0,\n requestedStorageBufferBindingSize > WEBGPU_DEFAULT_MAX_BUFFER_SIZE\n ? requestedStorageBufferBindingSize\n : 0\n );\n if (requestedMaxBufferSize > 0) {\n assertAdapterSupportsRequiredLimit(adapter, \"maxBufferSize\", requestedMaxBufferSize);\n requiredLimits.maxBufferSize = requestedMaxBufferSize;\n }\n\n const requiredFeatures = Array.from(descriptor.requiredFeatures ?? []);\n const adapterFeatures = adapter?.features;\n const timestampQuerySupported =\n typeof adapterFeatures?.has === \"function\"\n ? adapterFeatures.has(\"timestamp-query\")\n : adapterFeatures && typeof adapterFeatures[Symbol.iterator] === \"function\"\n ? Array.from(adapterFeatures).includes(\"timestamp-query\")\n : false;\n if (\n options.gpuTimestamps !== false &&\n timestampQuerySupported &&\n !requiredFeatures.includes(\"timestamp-query\")\n ) {\n requiredFeatures.push(\"timestamp-query\");\n }\n if (requiredFeatures.length > 0) {\n descriptor.requiredFeatures = requiredFeatures;\n }\n if (Object.keys(requiredLimits).length > 0) {\n descriptor.requiredLimits = {\n ...(descriptor.requiredLimits ?? {}),\n ...requiredLimits,\n };\n }\n return Object.keys(descriptor).length > 0 ? descriptor : undefined;\n}\n\nfunction readGpuLimit(adapter, device, name) {\n const adapterValue = Number(adapter?.limits?.[name]);\n if (Number.isFinite(adapterValue)) {\n return adapterValue;\n }\n const deviceValue = Number(device?.limits?.[name]);\n return Number.isFinite(deviceValue) ? deviceValue : null;\n}\n\nfunction createAdapterInfoSnapshot(adapter) {\n const info = adapter?.info;\n if (!info || typeof info !== \"object\") {\n return null;\n }\n return Object.freeze({\n vendor: typeof info.vendor === \"string\" ? info.vendor : \"\",\n architecture: typeof info.architecture === \"string\" ? info.architecture : \"\",\n device: typeof info.device === \"string\" ? info.device : \"\",\n description: typeof info.description === \"string\" ? info.description : \"\",\n });\n}\n\nexport function createGpuAdapterParallelismDiagnostics(adapter, device) {\n return Object.freeze({\n physicalCoreCount: null,\n physicalCoreCountAvailable: false,\n physicalCoreCountUnavailableReason: \"WebGPU does not expose physical GPU core counts.\",\n adapterInfo: createAdapterInfoSnapshot(adapter),\n adapterLimits: Object.freeze({\n maxComputeInvocationsPerWorkgroup: readGpuLimit(adapter, device, \"maxComputeInvocationsPerWorkgroup\"),\n maxComputeWorkgroupSizeX: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeX\"),\n maxComputeWorkgroupSizeY: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeY\"),\n maxComputeWorkgroupSizeZ: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeZ\"),\n maxComputeWorkgroupsPerDimension: readGpuLimit(adapter, device, \"maxComputeWorkgroupsPerDimension\"),\n maxStorageBuffersPerShaderStage: readGpuLimit(adapter, device, \"maxStorageBuffersPerShaderStage\"),\n maxStorageBufferBindingSize: readGpuLimit(adapter, device, \"maxStorageBufferBindingSize\"),\n maxBufferSize: readGpuLimit(adapter, device, \"maxBufferSize\"),\n }),\n configuredWorkgroupSize: WORKGROUP_SIZE,\n });\n}\n\nexport function createEnvironmentMapSnapshot(environmentMap) {\n return Object.freeze({\n enabled: environmentMap.enabled,\n width: environmentMap.width,\n height: environmentMap.height,\n mipLevelCount: environmentMap.mipLevelCount ?? 1,\n projection: environmentMap.projection,\n intensity: environmentMap.intensity,\n rotationRadians: environmentMap.rotationRadians,\n ambientStrength: environmentMap.ambientStrength,\n hasImportanceData: environmentMap.hasImportanceData === true,\n });\n}\n\nexport function nowMs() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction estimateAccelerationBuildWaitFactor(config) {\n if (config?.gpuAccelerationBuildRequired !== true) {\n return 1;\n }\n const bvhSortStageCount = Array.isArray(config?.bvhSortStages) ? config.bvhSortStages.length : 0;\n const bvhBuildLevelCount = Array.isArray(config?.bvhBuildLevels) ? config.bvhBuildLevels.length : 0;\n const accelerationStageCount = 2 + bvhSortStageCount + bvhBuildLevelCount;\n return Math.max(1, 1 + accelerationStageCount / 96);\n}\n\nexport function estimateSubmittedGpuWorkTiming(\n config,\n tileCount,\n overrideTimeoutMs = null,\n options = {}\n) {\n if (Number.isFinite(overrideTimeoutMs)) {\n const overrideMs = Math.max(1, Math.trunc(Number(overrideTimeoutMs)));\n return Object.freeze({\n timeoutMs: overrideMs,\n maxWaitMs: overrideMs,\n });\n }\n const samplesPerPixel = Math.max(\n 1,\n Number(config?.renderedSamplesPerPixel ?? config?.samplesPerPixel ?? 1)\n );\n const maxDepth = Math.max(1, Number(config?.maxDepth ?? 1));\n const deferredResolvePasses = config?.deferredPathResolve ? 1 : 0;\n const denoisePasses = config?.denoise ? (samplesPerPixel < 4 ? 2 : 1) : 0;\n const tiles = Math.max(1, Number(tileCount ?? 1));\n const estimatedPasses =\n tiles * (samplesPerPixel * (maxDepth + 1 + deferredResolvePasses) + denoisePasses + 1);\n const triangleCount = Math.max(0, Number(config?.triangleCount ?? 0));\n const geometryFactor = Math.max(1, triangleCount / 131072);\n const includeAccelerationBuild = options.includeAccelerationBuild === true;\n const accelerationFactor = includeAccelerationBuild\n ? estimateAccelerationBuildWaitFactor(config)\n : 1;\n const estimatedWindowMs = Math.round(\n (GPU_SUBMITTED_WORK_TIMEOUT_MS + estimatedPasses * 5) * geometryFactor * accelerationFactor\n );\n const timeoutMs = Math.min(\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n Math.max(GPU_SUBMITTED_WORK_TIMEOUT_MS, estimatedWindowMs)\n );\n const maxWaitMultiplier = includeAccelerationBuild ? 3 : 2;\n const maxWaitMs = Math.min(\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n Math.max(timeoutMs, estimatedWindowMs * maxWaitMultiplier)\n );\n return Object.freeze({\n timeoutMs,\n maxWaitMs,\n });\n}\n","import { GPU_SUBMITTED_WORK_TIMEOUT_MS } from \"./wavefront-core.js\";\nimport { nowMs } from \"./wavefront-runtime-support.js\";\n\nexport async function waitForSubmittedGpuWork(device, options = {}) {\n if (typeof device.queue.onSubmittedWorkDone !== \"function\") {\n return true;\n }\n const timeoutMs = Math.max(\n 1,\n Number.isFinite(options.timeoutMs)\n ? Number(options.timeoutMs)\n : GPU_SUBMITTED_WORK_TIMEOUT_MS\n );\n const maxWaitMs = Math.max(\n timeoutMs,\n Number.isFinite(options.maxWaitMs) ? Number(options.maxWaitMs) : timeoutMs\n );\n const allowTimeout = options.allowTimeout !== false;\n const completionPromise = device.queue.onSubmittedWorkDone().then(\n () => ({ status: \"done\" }),\n (error) => {\n throw error;\n }\n );\n const lossPromise =\n typeof device.lost?.then === \"function\"\n ? device.lost.then((info) => {\n throw new Error(\n `WebGPU device lost while waiting for submitted work (${info?.reason ?? \"unknown\"}).`\n );\n })\n : null;\n const startedAtMs = nowMs();\n while (true) {\n const elapsedMs = Math.max(0, nowMs() - startedAtMs);\n const remainingMs = Math.max(0, maxWaitMs - elapsedMs);\n if (remainingMs <= 0) {\n if (!allowTimeout) {\n throw new Error(`Timed out after ${Math.round(maxWaitMs)} ms waiting for submitted GPU work.`);\n }\n console.warn(\n `[plasius.wavefront] Submitted GPU work did not report completion within ${Math.round(maxWaitMs)} ms; continuing.`\n );\n return false;\n }\n const waitWindowMs = Math.max(1, Math.min(timeoutMs, remainingMs));\n let timeoutHandle = null;\n let resolveTimeoutPromise = null;\n let timeoutSettled = false;\n const settleTimeoutPromise = (value) => {\n if (timeoutSettled) {\n return;\n }\n timeoutSettled = true;\n resolveTimeoutPromise?.(value);\n };\n const timeoutPromise = new Promise((resolve) => {\n resolveTimeoutPromise = resolve;\n timeoutHandle = setTimeout(\n () => settleTimeoutPromise({ status: \"timeout\" }),\n waitWindowMs\n );\n });\n let result;\n try {\n result = await Promise.race(\n [completionPromise, timeoutPromise, lossPromise].filter(Boolean)\n );\n } finally {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n settleTimeoutPromise({ status: \"cancelled\" });\n }\n }\n if (result?.status === \"done\") {\n return true;\n }\n if (result?.status !== \"timeout\") {\n return true;\n }\n }\n}\n","import { GPU_READBACK_COMPLETION_TIMEOUT_MS } from \"./wavefront-core.js\";\nimport { createBuffer } from \"./wavefront-gpu-resources.js\";\n\nconst TIMESTAMP_QUERY_COUNT = 2;\nconst TIMESTAMP_BUFFER_BYTES = TIMESTAMP_QUERY_COUNT * BigUint64Array.BYTES_PER_ELEMENT;\n\nfunction hasGpuFeature(features, name) {\n if (typeof features?.has === \"function\") {\n return features.has(name);\n }\n if (features && typeof features[Symbol.iterator] === \"function\") {\n return Array.from(features).includes(name);\n }\n return false;\n}\n\nfunction freezeRayCountTelemetry(values = {}) {\n return Object.freeze({\n status: values.status ?? \"not-requested\",\n source: values.source ?? null,\n expectedPrimaryRays: values.expectedPrimaryRays ?? null,\n observedPrimaryRays: values.observedPrimaryRays ?? null,\n secondaryRays: values.secondaryRays ?? null,\n totalPathSegments: values.totalPathSegments ?? null,\n bounceHistogram: Object.freeze([...(values.bounceHistogram ?? [])]),\n capturedRayCounts: values.capturedRayCounts ?? 0,\n expectedRayCounts: values.expectedRayCounts ?? 0,\n reason: values.reason ?? null,\n });\n}\n\nexport function createWavefrontRayCountTelemetry(values = {}) {\n return freezeRayCountTelemetry(values);\n}\n\nexport function createWavefrontFrameTimingTelemetry(values = {}) {\n return Object.freeze({\n status: values.status ?? \"not-requested\",\n source: values.source ?? null,\n timestampQueryStatus: values.timestampQueryStatus ?? \"not-recorded\",\n totalGpuTimeMs: values.totalGpuTimeMs ?? null,\n totalRenderJobTimeMs: Math.max(0, Number(values.totalRenderJobTimeMs ?? 0)),\n classificationTimeMs: values.classificationTimeMs ?? null,\n compactionTimeMs: values.compactionTimeMs ?? null,\n samplingTimeMs: values.samplingTimeMs ?? null,\n reason: values.reason ?? null,\n });\n}\n\nfunction safeErrorReason(error) {\n return error instanceof Error && error.message\n ? error.message\n : \"unknown-telemetry-readback-failure\";\n}\n\nfunction timestampDurationMs(values) {\n if (values.length < TIMESTAMP_QUERY_COUNT || values[1] < values[0]) {\n return null;\n }\n const durationNanoseconds = values[1] - values[0];\n const durationMs = Number(durationNanoseconds) / 1_000_000;\n return Number.isFinite(durationMs) && durationMs >= 0 ? durationMs : null;\n}\n\nexport function createWavefrontFrameTelemetryResources({\n device,\n constants,\n maxRayCountRecords,\n}) {\n const rayRecordCapacity = Math.max(1, Math.trunc(Number(maxRayCountRecords) || 1));\n const rayBufferBytes = rayRecordCapacity * Uint32Array.BYTES_PER_ELEMENT;\n const mapMode = constants.map;\n if (!mapMode || typeof mapMode.READ !== \"number\") {\n return Object.freeze({\n available: false,\n reason: \"gpu-map-read-unavailable\",\n memoryBytes: 0,\n beginFrame() {},\n recordActiveRayCount() {},\n decorateFirstPass(descriptor) {\n return descriptor;\n },\n decorateFinalPass(descriptor) {\n return descriptor;\n },\n async readFrame({ expectedPrimaryRays = 0, expectedRayCounts = 0 } = {}) {\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"unavailable\",\n expectedPrimaryRays,\n expectedRayCounts,\n reason: \"gpu-map-read-unavailable\",\n }),\n timestampQueryStatus: \"unsupported\",\n totalGpuTimeMs: null,\n reason: \"gpu-map-read-unavailable\",\n });\n },\n destroy() {},\n });\n }\n\n const rayCountBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n rayBufferBytes,\n \"plasius.wavefront.rayCounts\"\n );\n const rayCountReadbackBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n rayBufferBytes,\n \"plasius.wavefront.rayCounts.readback\"\n );\n\n const timestampFeatureAvailable = hasGpuFeature(device?.features, \"timestamp-query\");\n const timestampApiAvailable =\n timestampFeatureAvailable &&\n typeof device.createQuerySet === \"function\" &&\n typeof constants.buffer.QUERY_RESOLVE === \"number\";\n let timestampQuerySet = null;\n let timestampResolveBuffer = null;\n let timestampReadbackBuffer = null;\n let timestampSetupReason = timestampFeatureAvailable\n ? \"timestamp-query-api-unavailable\"\n : \"timestamp-query-unsupported\";\n if (timestampApiAvailable) {\n try {\n timestampQuerySet = device.createQuerySet({\n label: \"plasius.wavefront.timestamps\",\n type: \"timestamp\",\n count: TIMESTAMP_QUERY_COUNT,\n });\n timestampResolveBuffer = createBuffer(\n device,\n constants.buffer.QUERY_RESOLVE | constants.buffer.COPY_SRC,\n TIMESTAMP_BUFFER_BYTES,\n \"plasius.wavefront.timestamps.resolve\"\n );\n timestampReadbackBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n TIMESTAMP_BUFFER_BYTES,\n \"plasius.wavefront.timestamps.readback\"\n );\n timestampSetupReason = null;\n } catch (error) {\n timestampQuerySet?.destroy?.();\n timestampQuerySet = null;\n timestampResolveBuffer?.destroy?.();\n timestampResolveBuffer = null;\n timestampReadbackBuffer?.destroy?.();\n timestampReadbackBuffer = null;\n timestampSetupReason = `timestamp-query-setup-failed:${safeErrorReason(error)}`;\n }\n }\n const timestampUnavailableStatus = timestampSetupReason?.startsWith(\n \"timestamp-query-setup-failed:\"\n )\n ? \"failed\"\n : \"unsupported\";\n\n let active = false;\n let recordCount = 0;\n let recordOverflow = false;\n let bounceIndices = [];\n let timestampStarted = false;\n let timestampEnded = false;\n let rayReadbackMapped = false;\n let timestampReadbackMapped = false;\n\n const memoryBytes =\n rayBufferBytes * 2 +\n (timestampQuerySet ? TIMESTAMP_BUFFER_BYTES * 2 : 0);\n\n function beginFrame() {\n active = true;\n recordCount = 0;\n recordOverflow = false;\n bounceIndices = [];\n timestampStarted = false;\n timestampEnded = false;\n }\n\n function recordActiveRayCount(encoder, counterBuffer, bounceIndex) {\n if (!active) {\n return;\n }\n if (recordCount >= rayRecordCapacity) {\n recordOverflow = true;\n return;\n }\n encoder.copyBufferToBuffer(\n counterBuffer,\n 0,\n rayCountBuffer,\n recordCount * Uint32Array.BYTES_PER_ELEMENT,\n Uint32Array.BYTES_PER_ELEMENT\n );\n bounceIndices.push(Math.max(0, Math.trunc(Number(bounceIndex) || 0)));\n recordCount += 1;\n }\n\n function decorateFirstPass(descriptor) {\n if (!active || !timestampQuerySet || timestampStarted) {\n return descriptor;\n }\n timestampStarted = true;\n return {\n ...descriptor,\n timestampWrites: {\n querySet: timestampQuerySet,\n beginningOfPassWriteIndex: 0,\n },\n };\n }\n\n function decorateFinalPass(descriptor) {\n if (!active || !timestampQuerySet || !timestampStarted || timestampEnded) {\n return descriptor;\n }\n timestampEnded = true;\n return {\n ...descriptor,\n timestampWrites: {\n querySet: timestampQuerySet,\n endOfPassWriteIndex: 1,\n },\n };\n }\n\n async function readFrame({\n expectedPrimaryRays = 0,\n expectedRayCounts = recordCount,\n waitForSubmittedGpuWork,\n } = {}) {\n active = false;\n if (recordOverflow || recordCount !== expectedRayCounts) {\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"failed\",\n expectedPrimaryRays,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: recordOverflow\n ? \"ray-count-record-capacity-exceeded\"\n : `ray-count-record-mismatch:${recordCount}/${expectedRayCounts}`,\n }),\n timestampQueryStatus: timestampQuerySet ? \"failed\" : timestampUnavailableStatus,\n totalGpuTimeMs: null,\n reason: \"ray-count-recording-incomplete\",\n });\n }\n\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.telemetry.readback\",\n });\n const rayCopyBytes = Math.max(\n Uint32Array.BYTES_PER_ELEMENT,\n recordCount * Uint32Array.BYTES_PER_ELEMENT\n );\n encoder.copyBufferToBuffer(rayCountBuffer, 0, rayCountReadbackBuffer, 0, rayCopyBytes);\n const canResolveTimestamps =\n timestampQuerySet &&\n timestampStarted &&\n timestampEnded &&\n typeof encoder.resolveQuerySet === \"function\";\n if (canResolveTimestamps) {\n encoder.resolveQuerySet(\n timestampQuerySet,\n 0,\n TIMESTAMP_QUERY_COUNT,\n timestampResolveBuffer,\n 0\n );\n encoder.copyBufferToBuffer(\n timestampResolveBuffer,\n 0,\n timestampReadbackBuffer,\n 0,\n TIMESTAMP_BUFFER_BYTES\n );\n }\n device.queue.submit([encoder.finish()]);\n\n try {\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await rayCountReadbackBuffer.mapAsync(mapMode.READ);\n rayReadbackMapped = true;\n const rayCopy = rayCountReadbackBuffer\n .getMappedRange()\n .slice(0, rayCopyBytes);\n const rayCounts = new Uint32Array(rayCopy, 0, recordCount);\n rayCountReadbackBuffer.unmap();\n rayReadbackMapped = false;\n\n let maximumBounceIndex = 0;\n for (const bounceIndex of bounceIndices) {\n maximumBounceIndex = Math.max(maximumBounceIndex, bounceIndex);\n }\n const bounceHistogram = Array.from({ length: maximumBounceIndex + 1 }, () => 0);\n let observedPrimaryRays = 0;\n let secondaryRays = 0;\n let totalPathSegments = 0;\n for (let index = 0; index < rayCounts.length; index += 1) {\n const count = Number(rayCounts[index] ?? 0);\n const bounceIndex = bounceIndices[index] ?? 0;\n bounceHistogram[bounceIndex] = (bounceHistogram[bounceIndex] ?? 0) + count;\n totalPathSegments += count;\n if (bounceIndex === 0) {\n observedPrimaryRays += count;\n } else {\n secondaryRays += count;\n }\n }\n const primaryCountsMatch = observedPrimaryRays === expectedPrimaryRays;\n const rayTelemetry = freezeRayCountTelemetry({\n status: primaryCountsMatch ? \"available\" : \"failed\",\n source: \"gpu-active-queue-readback\",\n expectedPrimaryRays,\n observedPrimaryRays,\n secondaryRays: primaryCountsMatch ? secondaryRays : null,\n totalPathSegments: primaryCountsMatch ? totalPathSegments : null,\n bounceHistogram,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: primaryCountsMatch\n ? null\n : `primary-ray-count-mismatch:${observedPrimaryRays}/${expectedPrimaryRays}`,\n });\n\n let timestampQueryStatus = timestampQuerySet ? \"failed\" : timestampUnavailableStatus;\n let totalGpuTimeMs = null;\n let timestampReason = timestampSetupReason;\n if (canResolveTimestamps) {\n try {\n await timestampReadbackBuffer.mapAsync(mapMode.READ);\n timestampReadbackMapped = true;\n const timestampCopy = timestampReadbackBuffer\n .getMappedRange()\n .slice(0, TIMESTAMP_BUFFER_BYTES);\n const timestamps = new BigUint64Array(timestampCopy);\n timestampReadbackBuffer.unmap();\n timestampReadbackMapped = false;\n totalGpuTimeMs = timestampDurationMs(timestamps);\n timestampQueryStatus = totalGpuTimeMs === null ? \"failed\" : \"available\";\n timestampReason =\n totalGpuTimeMs === null ? \"timestamp-query-returned-invalid-range\" : null;\n } catch (error) {\n if (timestampReadbackMapped) {\n timestampReadbackBuffer.unmap();\n timestampReadbackMapped = false;\n }\n timestampQueryStatus = \"failed\";\n timestampReason = `timestamp-query-readback-failed:${safeErrorReason(error)}`;\n }\n } else if (timestampQuerySet) {\n timestampReason = \"timestamp-query-span-incomplete\";\n }\n\n return Object.freeze({\n rayCounts: rayTelemetry,\n timestampQueryStatus,\n totalGpuTimeMs,\n reason: timestampReason,\n });\n } catch (error) {\n if (rayReadbackMapped) {\n rayCountReadbackBuffer.unmap();\n rayReadbackMapped = false;\n }\n if (timestampReadbackMapped) {\n timestampReadbackBuffer?.unmap();\n timestampReadbackMapped = false;\n }\n const reason = safeErrorReason(error);\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"failed\",\n expectedPrimaryRays,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: `ray-count-readback-failed:${reason}`,\n }),\n timestampQueryStatus: timestampQuerySet ? \"failed\" : timestampUnavailableStatus,\n totalGpuTimeMs: null,\n reason: `telemetry-readback-failed:${reason}`,\n });\n }\n }\n\n function destroy() {\n active = false;\n rayCountBuffer.destroy?.();\n rayCountReadbackBuffer.destroy?.();\n timestampQuerySet?.destroy?.();\n timestampResolveBuffer?.destroy?.();\n timestampReadbackBuffer?.destroy?.();\n }\n\n return Object.freeze({\n available: true,\n reason: null,\n memoryBytes,\n beginFrame,\n recordActiveRayCount,\n decorateFirstPass,\n decorateFinalPass,\n readFrame,\n destroy,\n });\n}\n","import { createGpuParallelismDiagnostics } from \"./wavefront-frame-runtime.js\";\nimport { createEnvironmentMapSnapshot } from \"./wavefront-runtime-support.js\";\nimport {\n clamp,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\nimport {\n createWavefrontFrameTimingTelemetry,\n createWavefrontRayCountTelemetry,\n} from \"./wavefront-frame-telemetry.js\";\n\nexport function resolveWavefrontRenderedSamplesPerPixel({\n config,\n renderOptions = {},\n awaitGPUCompletion = true,\n lastCompletedFrameTimeMs = null,\n lastCompletedSamplesPerPixel = 1,\n}) {\n const targetSamplesPerPixel = clamp(\n readPositiveInteger(\n \"samplesPerPixel\",\n renderOptions.samplesPerPixel,\n config.samplesPerPixel\n ),\n 1,\n config.samplesPerPixel\n );\n const frameTimeBudgetMs = Number.isFinite(renderOptions.frameTimeBudgetMs)\n ? Math.max(0, Number(renderOptions.frameTimeBudgetMs))\n : null;\n const minimumSamplesPerPixel = clamp(\n readPositiveInteger(\n \"minimumSamplesPerPixel\",\n renderOptions.minimumSamplesPerPixel,\n frameTimeBudgetMs !== null && targetSamplesPerPixel > 1 ? 1 : targetSamplesPerPixel\n ),\n 1,\n targetSamplesPerPixel\n );\n if (frameTimeBudgetMs === null || !awaitGPUCompletion || targetSamplesPerPixel <= minimumSamplesPerPixel) {\n return Object.freeze({\n renderedSamplesPerPixel: targetSamplesPerPixel,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: false,\n });\n }\n const estimatedSampleTimeMs =\n Number.isFinite(lastCompletedFrameTimeMs) && lastCompletedFrameTimeMs > 0\n ? lastCompletedFrameTimeMs / Math.max(1, lastCompletedSamplesPerPixel)\n : null;\n if (!Number.isFinite(estimatedSampleTimeMs) || estimatedSampleTimeMs <= 0) {\n return Object.freeze({\n renderedSamplesPerPixel: minimumSamplesPerPixel,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: minimumSamplesPerPixel < targetSamplesPerPixel,\n });\n }\n const budgetLimitedSamples = clamp(\n Math.floor(frameTimeBudgetMs / estimatedSampleTimeMs),\n minimumSamplesPerPixel,\n targetSamplesPerPixel\n );\n return Object.freeze({\n renderedSamplesPerPixel: budgetLimitedSamples,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: budgetLimitedSamples < targetSamplesPerPixel,\n });\n}\n\nexport function createWavefrontFrameStats({\n config,\n tiles,\n frame,\n frameIndex,\n accelerationBuilt,\n accelerationBuildCount,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n frameConfigSlotCount,\n gpuAdapterParallelism,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n}) {\n const gpuParallelism = createGpuParallelismDiagnostics(\n gpuAdapterParallelism,\n parallelismCounters\n );\n const commandSubmissions = frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0);\n return Object.freeze({\n frameStats: Object.freeze({\n frame,\n frameIndex,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tiles: tiles.length,\n tileSize: config.tileSize,\n samplesPerPixel: targetSamplesPerPixel,\n renderedSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n screenRays: config.width * config.height,\n primaryRays: config.width * config.height * renderedSamplesPerPixel,\n secondaryRays: null,\n totalPathSegments: null,\n rayCounts: createWavefrontRayCountTelemetry(),\n timings: createWavefrontFrameTimingTelemetry(),\n telemetryMemoryBytes: 0,\n sceneObjectCount: config.sceneObjectCount,\n triangleCount: config.triangleCount,\n emissiveTriangleCount: config.emissiveTriangleCount,\n environmentPortalCount: config.environmentPortalCount,\n environmentPortalMode: config.environmentPortalMode,\n mediumCount: config.mediumCount,\n environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n transportExperiments: config.transportExperiments,\n transportExperimentFlags: config.transportExperimentFlags,\n bvhNodeCount: config.bvhNodeCount,\n displayQuality: config.displayQuality,\n accelerationBuildMode: config.accelerationBuildMode,\n gpuAccelerationBuildRequired: config.gpuAccelerationBuildRequired,\n accelerationBuildSubmitted,\n accelerationBuilt,\n accelerationBuildCount,\n commandSubmissions,\n frameConfigSlots: frameConfigSlotCount,\n gpuParallelism,\n memory: config.memory,\n }),\n gpuParallelism,\n });\n}\n","import {\n recordDirectDispatch,\n recordIndirectDispatch,\n} from \"./wavefront-frame-runtime.js\";\nimport {\n COUNTER_DISPATCH_ARGS_OFFSET,\n INDIRECT_DISPATCH_ARGS_BYTES,\n WORKGROUP_SIZE,\n} from \"./wavefront-core.js\";\n\nfunction resolveGetter(valueOrGetter) {\n return typeof valueOrGetter === \"function\" ? valueOrGetter : () => valueOrGetter;\n}\n\nexport function createWavefrontFrameEncoder({\n getConfig,\n getBindGroups,\n pipelines,\n counterBuffer,\n activeDispatchBuffer,\n denoiseRadianceBindGroup,\n denoiseResolveBindGroup,\n denoiseDirectResolveBindGroup,\n presentPipeline,\n presentBindGroup,\n context,\n getFrameTelemetry = () => null,\n}) {\n const resolveConfig = resolveGetter(getConfig);\n const resolveBindGroups = resolveGetter(getBindGroups);\n\n return Object.freeze({\n encodeTileSample(encoder, tile, configOffset, parallelism) {\n const config = resolveConfig();\n const bindGroups = resolveBindGroups();\n const frameTelemetry = getFrameTelemetry();\n const generatePass = encoder.beginComputePass(\n frameTelemetry?.decorateFirstPass({\n label: \"plasius.wavefront.generatePrimaryRaysPass\",\n }) ?? { label: \"plasius.wavefront.generatePrimaryRaysPass\" }\n );\n const tileWorkgroups = Math.ceil((tile.width * tile.height) / WORKGROUP_SIZE);\n\n generatePass.setBindGroup(0, bindGroups[0], [configOffset]);\n generatePass.setPipeline(pipelines.generatePrimaryRays);\n generatePass.dispatchWorkgroups(tileWorkgroups);\n recordDirectDispatch(parallelism, [tileWorkgroups], WORKGROUP_SIZE);\n generatePass.end();\n\n for (let bounceIndex = 0; bounceIndex < config.maxDepth; bounceIndex += 1) {\n frameTelemetry?.recordActiveRayCount(encoder, counterBuffer, bounceIndex);\n encoder.copyBufferToBuffer(\n counterBuffer,\n COUNTER_DISPATCH_ARGS_OFFSET,\n activeDispatchBuffer,\n 0,\n INDIRECT_DISPATCH_ARGS_BYTES\n );\n const passEncoder = encoder.beginComputePass({\n label: `plasius.wavefront.bounce.${bounceIndex}`,\n });\n passEncoder.setBindGroup(0, bindGroups[bounceIndex % 2], [configOffset]);\n passEncoder.setPipeline(pipelines.intersectActiveQueue);\n passEncoder.dispatchWorkgroupsIndirect(activeDispatchBuffer, 0);\n recordIndirectDispatch(parallelism, tileWorkgroups, WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.resolveSurfaceRecords);\n passEncoder.dispatchWorkgroupsIndirect(activeDispatchBuffer, 0);\n recordIndirectDispatch(parallelism, tileWorkgroups, WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.compactAndSwapQueues);\n passEncoder.dispatchWorkgroups(1);\n recordDirectDispatch(parallelism, [1], 1);\n passEncoder.end();\n }\n },\n\n encodeTileOutput(encoder, tile, configOffset, parallelism) {\n const bindGroups = resolveBindGroups();\n const passEncoder = encoder.beginComputePass({\n label: \"plasius.wavefront.outputPass\",\n });\n const tileWorkgroups = Math.ceil((tile.width * tile.height) / WORKGROUP_SIZE);\n\n passEncoder.setBindGroup(0, bindGroups[0], [configOffset]);\n passEncoder.setPipeline(pipelines.accumulateTerminalRadiance);\n passEncoder.dispatchWorkgroups(tileWorkgroups);\n recordDirectDispatch(parallelism, [tileWorkgroups], WORKGROUP_SIZE);\n passEncoder.end();\n },\n\n encodeDenoise(encoder, configOffset, parallelism, renderedSamplesPerPixel) {\n const config = resolveConfig();\n if (!config.denoise) {\n return;\n }\n const denoiseWorkgroupsX = Math.ceil(config.width / 8);\n const denoiseWorkgroupsY = Math.ceil(config.height / 8);\n const useTwoPassDenoise = renderedSamplesPerPixel < 4;\n if (useTwoPassDenoise) {\n const radiancePass = encoder.beginComputePass({\n label: \"plasius.wavefront.denoiseRadiancePass\",\n });\n radiancePass.setBindGroup(0, denoiseRadianceBindGroup, [configOffset]);\n radiancePass.setPipeline(pipelines.denoiseLinearRadiance);\n radiancePass.dispatchWorkgroups(denoiseWorkgroupsX, denoiseWorkgroupsY);\n recordDirectDispatch(\n parallelism,\n [denoiseWorkgroupsX, denoiseWorkgroupsY],\n WORKGROUP_SIZE\n );\n radiancePass.end();\n }\n\n const resolvePass = encoder.beginComputePass({\n label: \"plasius.wavefront.denoiseResolvePass\",\n });\n resolvePass.setBindGroup(\n 0,\n useTwoPassDenoise ? denoiseResolveBindGroup : denoiseDirectResolveBindGroup,\n [configOffset]\n );\n resolvePass.setPipeline(pipelines.resolveDenoisedOutputImage);\n resolvePass.dispatchWorkgroups(denoiseWorkgroupsX, denoiseWorkgroupsY);\n recordDirectDispatch(\n parallelism,\n [denoiseWorkgroupsX, denoiseWorkgroupsY],\n WORKGROUP_SIZE\n );\n resolvePass.end();\n },\n\n encodePresent(encoder) {\n const texture = context.getCurrentTexture();\n const descriptor = {\n label: \"plasius.wavefront.presentPass\",\n colorAttachments: [\n {\n view: texture.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n };\n const passEncoder = encoder.beginRenderPass(\n getFrameTelemetry()?.decorateFinalPass(descriptor) ?? descriptor\n );\n passEncoder.setPipeline(presentPipeline);\n passEncoder.setBindGroup(0, presentBindGroup);\n passEncoder.draw(3);\n passEncoder.end();\n },\n });\n}\n","import { createGpuSubmissionBatcher } from \"./wavefront-frame-runtime.js\";\nimport {\n clamp,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\n\nexport function dispatchWavefrontFrame({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n frameEncoder,\n createFrameConfigWriter,\n}) {\n const writeFrameConfig = createFrameConfigWriter(frameIndex);\n const batch = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n });\n\n for (const tile of tiles) {\n for (let sampleIndex = 0; sampleIndex < renderedSamplesPerPixel; sampleIndex += 1) {\n const configOffset = writeFrameConfig(tile, {\n sampleIndex,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n frameEncoder.encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, configOffset, parallelism);\n }\n }\n if (!config.deferredPathResolve) {\n const outputConfigOffset = writeFrameConfig(tile, {\n sampleIndex: 0,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, outputConfigOffset, parallelism);\n }\n }\n if (config.denoise) {\n const denoiseConfigOffset = writeFrameConfig(\n { x: 0, y: 0, width: config.width, height: config.height },\n { sampleIndex: 0, sampleWeight: 1 / renderedSamplesPerPixel }\n );\n const denoisePassCount = renderedSamplesPerPixel < 4 ? 2 : 1;\n frameEncoder.encodeDenoise(\n batch.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n frameEncoder.encodePresent(batch.reserve(1));\n return batch.flush();\n}\n\nexport function dispatchWavefrontFrameAwaitingGpu({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n frameEncoder,\n writeFrameConfigSlot,\n optionsForFrame = {},\n}) {\n const samplePassesPerSample = config.maxDepth + 1 + (config.deferredPathResolve ? 1 : 0);\n const denoisePassCount = config.denoise ? (renderedSamplesPerPixel < 4 ? 2 : 1) : 0;\n const tailPassCount = denoisePassCount + 1;\n const sampleBatchSize = Math.max(\n 1,\n Math.floor(\n Math.max(config.maxFramePassesPerSubmission - tailPassCount, 1) /\n Math.max(samplePassesPerSample, 1)\n )\n );\n const sampleRangeStart = clamp(\n readNonNegativeInteger(\"sampleRangeStart\", optionsForFrame.sampleRangeStart, 0),\n 0,\n renderedSamplesPerPixel\n );\n const sampleRangeEnd = clamp(\n readPositiveInteger(\"sampleRangeEnd\", optionsForFrame.sampleRangeEnd, renderedSamplesPerPixel),\n sampleRangeStart,\n renderedSamplesPerPixel\n );\n const includeDenoise = optionsForFrame.includeDenoise === true;\n const includePresent = optionsForFrame.includePresent === true;\n const tileStartIndex = clamp(\n readNonNegativeInteger(\"tileStartIndex\", optionsForFrame.tileStartIndex, 0),\n 0,\n tiles.length\n );\n const tileEndIndex = clamp(\n readPositiveInteger(\"tileEndIndex\", optionsForFrame.tileEndIndex, tiles.length),\n tileStartIndex,\n tiles.length\n );\n let submissionCount = Math.max(\n 0,\n readNonNegativeInteger(\"startingSubmissionCount\", optionsForFrame.startingSubmissionCount, 0)\n );\n let slot = Math.max(0, readNonNegativeInteger(\"startingSlot\", optionsForFrame.startingSlot, 0));\n\n for (const tile of tiles.slice(tileStartIndex, tileEndIndex)) {\n for (\n let sampleStart = sampleRangeStart;\n sampleStart < sampleRangeEnd;\n sampleStart += sampleBatchSize\n ) {\n const sampleEnd = Math.min(sampleRangeEnd, sampleStart + sampleBatchSize);\n const batch = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n for (let sampleIndex = sampleStart; sampleIndex < sampleEnd; sampleIndex += 1) {\n const configOffset = writeFrameConfigSlot(slot, tile, frameIndex, {\n sampleIndex,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n slot += 1;\n frameEncoder.encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, configOffset, parallelism);\n }\n }\n if (!config.deferredPathResolve && sampleRangeEnd >= renderedSamplesPerPixel) {\n const outputConfigOffset = writeFrameConfigSlot(slot, tile, frameIndex, {\n sampleIndex: 0,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n slot += 1;\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, outputConfigOffset, parallelism);\n }\n batch.flush();\n submissionCount += batch.getSubmissionCount();\n }\n }\n\n if (includeDenoise || includePresent) {\n const tail = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n if (includeDenoise && config.denoise) {\n const denoiseConfigOffset = writeFrameConfigSlot(\n slot,\n { x: 0, y: 0, width: config.width, height: config.height },\n frameIndex,\n { sampleIndex: 0, sampleWeight: 1 / renderedSamplesPerPixel }\n );\n slot += 1;\n frameEncoder.encodeDenoise(\n tail.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n if (includePresent) {\n frameEncoder.encodePresent(tail.reserve(1));\n }\n tail.flush();\n submissionCount += tail.getSubmissionCount();\n }\n return Object.freeze({\n submissionCount,\n slot,\n });\n}\n","export const WAVEFRONT_SHADER_BVH_WGSL = `\nfn default_mesh_range() -> MeshRange {\n return MeshRange(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(0.72, 0.72, 0.68, 1.0),\n vec4<f32>(0.0),\n vec4<f32>(0.72, 0.0, 1.0, 1.45),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(1.0, 1.0, 1.0, 0.0)\n );\n}\n\nfn mesh_range_for_triangle(triangleIndex: u32) -> MeshRange {\n var selected = default_mesh_range();\n for (var meshIndex = 0u; meshIndex < config.meshSourceCount; meshIndex = meshIndex + 1u) {\n let mesh = meshRanges[meshIndex];\n let triangleStart = mesh.firstTriangle;\n let triangleEnd = mesh.firstTriangle + mesh.triangleCount;\n if (triangleIndex >= triangleStart && triangleIndex < triangleEnd) {\n selected = mesh;\n break;\n }\n }\n return selected;\n}\n\nfn node_bounds_min(left: BvhNode, right: BvhNode) -> vec3<f32> {\n return min(left.boundsMin.xyz, right.boundsMin.xyz);\n}\n\nfn node_bounds_max(left: BvhNode, right: BvhNode) -> vec3<f32> {\n return max(left.boundsMax.xyz, right.boundsMax.xyz);\n}\n\nfn ordered_float_key(value: f32) -> u32 {\n let bits = bitcast<u32>(value);\n let sign = bits & 0x80000000u;\n let mask = select(0x80000000u, 0xffffffffu, sign != 0u);\n return bits ^ mask;\n}\n\nfn split_by_3(value: u32) -> u32 {\n var x = value & 0x000003ffu;\n x = (x | (x << 16u)) & 0x030000ffu;\n x = (x | (x << 8u)) & 0x0300f00fu;\n x = (x | (x << 4u)) & 0x030c30c3u;\n x = (x | (x << 2u)) & 0x09249249u;\n return x;\n}\n\nfn morton_key_from_centroid(centroid: vec3<f32>) -> u32 {\n let x = (ordered_float_key(centroid.x) >> 12u) & 0x000003ffu;\n let y = (ordered_float_key(centroid.y) >> 12u) & 0x000003ffu;\n let z = (ordered_float_key(centroid.z) >> 12u) & 0x000003ffu;\n return (split_by_3(x) << 2u) | (split_by_3(y) << 1u) | split_by_3(z);\n}\n\nfn leaf_ref_less(left: BvhLeafRef, right: BvhLeafRef) -> bool {\n if (left.key < right.key) {\n return true;\n }\n if (left.key > right.key) {\n return false;\n }\n return left.triangleIndex < right.triangleIndex;\n}\n\n@compute @workgroup_size(64)\nfn prepareMeshTrianglesAndLeaves(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let triangleIndex = globalId.x;\n if (triangleIndex >= config.triangleCount) {\n if (triangleIndex < config.bvhSortItemCount) {\n bvhLeafRefs[triangleIndex] = BvhLeafRef(0xffffffffu, 0xffffffffu, 0u, 0u);\n }\n return;\n }\n\n let mesh = mesh_range_for_triangle(triangleIndex);\n let localTriangle = triangleIndex - mesh.firstTriangle;\n let indexOffset = mesh.firstIndex + localTriangle * 3u;\n let index0 = meshIndices[indexOffset];\n let index1 = meshIndices[indexOffset + 1u];\n let index2 = meshIndices[indexOffset + 2u];\n let vertex0 = meshVertices[index0];\n let vertex1 = meshVertices[index1];\n let vertex2 = meshVertices[index2];\n let edge1 = vertex1.position.xyz - vertex0.position.xyz;\n let edge2 = vertex2.position.xyz - vertex0.position.xyz;\n let centroid = (vertex0.position.xyz + vertex1.position.xyz + vertex2.position.xyz) / 3.0;\n let faceNormal = safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n let n0 = select(faceNormal, safe_normalize(vertex0.normal.xyz, faceNormal), vertex0.normal.w > 0.5);\n let n1 = select(faceNormal, safe_normalize(vertex1.normal.xyz, faceNormal), vertex1.normal.w > 0.5);\n let n2 = select(faceNormal, safe_normalize(vertex2.normal.xyz, faceNormal), vertex2.normal.w > 0.5);\n let uv0 = select(vec2<f32>(0.0), vertex0.uv.xy, vertex0.uv.z > 0.5);\n let uv1 = select(vec2<f32>(0.0), vertex1.uv.xy, vertex1.uv.z > 0.5);\n let uv2 = select(vec2<f32>(0.0), vertex2.uv.xy, vertex2.uv.z > 0.5);\n\n var preparedTriangle = TriangleRecord();\n preparedTriangle.triangleId = triangleIndex;\n preparedTriangle.meshId = mesh.meshId;\n preparedTriangle.materialKind = mesh.materialKind;\n preparedTriangle.flags = mesh.flags;\n preparedTriangle.materialRefId = mesh.materialRefId;\n preparedTriangle.mediumRefId = mesh.mediumRefId;\n preparedTriangle.materialSlot = mesh.materialSlot;\n preparedTriangle.v0 = vec4<f32>(vertex0.position.xyz, 0.0);\n preparedTriangle.v1 = vec4<f32>(vertex1.position.xyz, 0.0);\n preparedTriangle.v2 = vec4<f32>(vertex2.position.xyz, 0.0);\n preparedTriangle.n0 = vec4<f32>(n0, 0.0);\n preparedTriangle.n1 = vec4<f32>(n1, 0.0);\n preparedTriangle.n2 = vec4<f32>(n2, 0.0);\n preparedTriangle.uv0uv1 = vec4<f32>(uv0, uv1);\n preparedTriangle.uv2Pad = vec4<f32>(uv2, 0.0, 0.0);\n preparedTriangle.color = mesh.color;\n preparedTriangle.emission = mesh.emission;\n preparedTriangle.material = mesh.material;\n preparedTriangle.materialResponse = mesh.materialResponse;\n preparedTriangle.materialExtension = mesh.materialExtension;\n preparedTriangle.specularColor = mesh.specularColor;\n preparedTriangle.baseColorAtlas = mesh.baseColorAtlas;\n preparedTriangle.metallicRoughnessAtlas = mesh.metallicRoughnessAtlas;\n preparedTriangle.normalAtlas = mesh.normalAtlas;\n preparedTriangle.occlusionAtlas = mesh.occlusionAtlas;\n preparedTriangle.emissiveAtlas = mesh.emissiveAtlas;\n preparedTriangle.textureSettings = mesh.textureSettings;\n preparedTriangle.materialExtension2 = vec4<f32>(0.0, 0.0, 1.3, 0.0);\n preparedTriangle.materialExtension3 = vec4<f32>(100.0, 400.0, 0.0, 0.0);\n preparedTriangle.clearcoatAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.clearcoatRoughnessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.clearcoatNormalAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.transmissionAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.thicknessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.sheenColorAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.sheenRoughnessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.specularAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.specularColorAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.iridescenceAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.iridescenceThicknessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.anisotropyAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n triangles[triangleIndex] = preparedTriangle;\n\n let leafBase = config.triangleCount - 1u;\n let nodeIndex = leafBase + triangleIndex;\n let boundsMin = min(vertex0.position.xyz, min(vertex1.position.xyz, vertex2.position.xyz));\n let boundsMax = max(vertex0.position.xyz, max(vertex1.position.xyz, vertex2.position.xyz));\n bvhLeafRefs[triangleIndex] = BvhLeafRef(\n morton_key_from_centroid(centroid),\n triangleIndex,\n 0u,\n 0u\n );\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(boundsMin, 0.0),\n vec4<f32>(boundsMax, 0.0),\n triangleIndex,\n 1u,\n 0u,\n 0u\n );\n}\n\n@compute @workgroup_size(64)\nfn sortBvhLeafRefs(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let sortCount = config.bvhSortItemCount;\n if (sortCount <= 1u || index >= sortCount) {\n return;\n }\n\n let compareDistance = config.bvhBuildNodeStart;\n let sequenceSize = config.bvhBuildNodeCount;\n if (compareDistance == 0u || sequenceSize == 0u) {\n return;\n }\n\n let partner = index ^ compareDistance;\n if (partner <= index || partner >= sortCount) {\n return;\n }\n\n let left = bvhLeafRefs[index];\n let right = bvhLeafRefs[partner];\n let ascending = (index & sequenceSize) == 0u;\n let leftIsLess = leaf_ref_less(left, right);\n let rightIsLess = leaf_ref_less(right, left);\n let shouldSwap = select(leftIsLess, rightIsLess, ascending);\n if (shouldSwap) {\n bvhLeafRefs[index] = right;\n bvhLeafRefs[partner] = left;\n }\n}\n\n@compute @workgroup_size(64)\nfn writeSortedBvhLeaves(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let sortedIndex = globalId.x;\n if (sortedIndex >= config.triangleCount || config.triangleCount == 0u) {\n return;\n }\n\n let leafRef = bvhLeafRefs[sortedIndex];\n if (leafRef.triangleIndex >= config.triangleCount) {\n return;\n }\n\n let triangle = triangles[leafRef.triangleIndex];\n let boundsMin = min(triangle.v0.xyz, min(triangle.v1.xyz, triangle.v2.xyz));\n let boundsMax = max(triangle.v0.xyz, max(triangle.v1.xyz, triangle.v2.xyz));\n let leafBase = config.triangleCount - 1u;\n let nodeIndex = leafBase + sortedIndex;\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(boundsMin, 0.0),\n vec4<f32>(boundsMax, 0.0),\n leafRef.triangleIndex,\n 1u,\n 0u,\n 0u\n );\n}\n\n@compute @workgroup_size(64)\nfn buildBvhInternalLevel(@builtin(global_invocation_id) globalId: vec3<u32>) {\n if (config.triangleCount <= 1u || globalId.x >= config.bvhBuildNodeCount) {\n return;\n }\n\n let internalCount = config.triangleCount - 1u;\n let nodeIndex = config.bvhBuildNodeStart + globalId.x;\n if (nodeIndex >= internalCount || nodeIndex >= config.bvhNodeCapacity) {\n return;\n }\n\n let leftIndex = nodeIndex * 2u + 1u;\n let rightIndex = nodeIndex * 2u + 2u;\n if (rightIndex >= config.bvhNodeCapacity || rightIndex >= config.bvhNodeCount) {\n return;\n }\n\n let left = bvhNodes[leftIndex];\n let right = bvhNodes[rightIndex];\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(node_bounds_min(left, right), 0.0),\n vec4<f32>(node_bounds_max(left, right), 0.0),\n leftIndex,\n 0u,\n rightIndex,\n 0u\n );\n}\n\nfn make_ray(pixelIndex: u32) -> RayRecord {\n let localX = pixelIndex % config.tileWidth;\n let localY = pixelIndex / config.tileWidth;\n let px = config.tileX + localX;\n let py = config.tileY + localY;\n let sampleId = u32(config.projectionAndSampling.w);\n let sourcePixelId = py * config.canvasWidth + px;\n let jitter = sample_dimension_2d(\n sourcePixelId,\n sampleId,\n 0u,\n config.frameIndex,\n SAMPLE_DIM_CAMERA_JITTER,\n config.samplesPerPixel\n ) - vec2<f32>(0.5);\n let jitterX = jitter.x;\n let jitterY = jitter.y;\n let ndcX = ((f32(px) + 0.5 + jitterX * 0.35) / f32(config.canvasWidth)) * 2.0 - 1.0;\n let ndcY = 1.0 - ((f32(py) + 0.5 + jitterY * 0.35) / f32(config.canvasHeight)) * 2.0;\n let viewX = ndcX * config.projectionAndSampling.x * config.projectionAndSampling.y;\n let viewY = ndcY * config.projectionAndSampling.x;\n let direction = safe_normalize(\n config.cameraForward.xyz + config.cameraRight.xyz * viewX + config.cameraUp.xyz * viewY,\n config.cameraForward.xyz\n );\n return RayRecord(\n pixelIndex,\n 0xffffffffu,\n sourcePixelId,\n sampleId,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(config.cameraPosition.xyz, 1.0),\n vec4<f32>(direction, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<u32>(0u)\n );\n}\n\nfn make_miss(ray: RayRecord) -> HitRecord {\n let radiance = gated_environment_radiance(ray.origin.xyz, ray.direction.xyz);\n return HitRecord(\n ray.rayId,\n ray.sourcePixelId,\n 2u,\n 0u,\n 0u,\n 1u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n -1.0,\n 1.0,\n vec2<f32>(0.0),\n vec4<f32>(ray.origin.xyz + ray.direction.xyz * 1000.0, 1.0),\n vec4<f32>(-ray.direction.xyz, 0.0),\n vec4<f32>(-ray.direction.xyz, 0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(radiance, 1.0),\n vec4<f32>(0.0),\n vec4<f32>(1.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(0.08, 1.0, 0.0, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0)\n );\n}\n\nfn intersect_sphere(ray: RayRecord, object: SceneObject) -> Candidate {\n let oc = ray.origin.xyz - object.center.xyz;\n let radius = max(object.halfExtent.x, 0.001);\n let halfB = dot(oc, ray.direction.xyz);\n let c = dot(oc, oc) - radius * radius;\n let discriminant = halfB * halfB - c;\n if (discriminant < 0.0) {\n return no_candidate();\n }\n let sqrtD = sqrt(discriminant);\n var distance = -halfB - sqrtD;\n if (distance <= 0.001) {\n distance = -halfB + sqrtD;\n }\n if (distance <= 0.001) {\n return no_candidate();\n }\n let position = ray.origin.xyz + ray.direction.xyz * distance;\n let outward = safe_normalize((position - object.center.xyz) / radius, vec3<f32>(0.0, 1.0, 0.0));\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, outward) < 0.0);\n let normal = select(-outward, outward, frontFace == 1u);\n return surface_candidate(\n distance,\n normal,\n normal,\n vec3<f32>(1.0, 0.0, 0.0),\n vec2<f32>(0.0),\n frontFace,\n 0xffffffffu,\n object.objectId,\n object.objectId,\n object.mediumRefId\n );\n}\n\nfn safe_inverse(value: f32) -> f32 {\n if (abs(value) < 0.000001) {\n return select(-1000000.0, 1000000.0, value >= 0.0);\n }\n return 1.0 / value;\n}\n\nfn intersect_box(ray: RayRecord, object: SceneObject) -> Candidate {\n let boxMin = object.center.xyz - object.halfExtent.xyz;\n let boxMax = object.center.xyz + object.halfExtent.xyz;\n let inv = vec3<f32>(\n safe_inverse(ray.direction.x),\n safe_inverse(ray.direction.y),\n safe_inverse(ray.direction.z)\n );\n let t0 = (boxMin - ray.origin.xyz) * inv;\n let t1 = (boxMax - ray.origin.xyz) * inv;\n let tNear = min(t0, t1);\n let tFar = max(t0, t1);\n let entry = max(max(tNear.x, tNear.y), tNear.z);\n let exit = min(min(tFar.x, tFar.y), tFar.z);\n if (exit < max(entry, 0.001)) {\n return no_candidate();\n }\n let distance = max(entry, 0.001);\n let position = ray.origin.xyz + ray.direction.xyz * distance;\n let rel = (position - object.center.xyz) / max(object.halfExtent.xyz, vec3<f32>(0.001));\n let absRel = abs(rel);\n var outward = vec3<f32>(0.0, 1.0, 0.0);\n if (absRel.x >= absRel.y && absRel.x >= absRel.z) {\n outward = vec3<f32>(select(-1.0, 1.0, rel.x >= 0.0), 0.0, 0.0);\n } else if (absRel.y >= absRel.z) {\n outward = vec3<f32>(0.0, select(-1.0, 1.0, rel.y >= 0.0), 0.0);\n } else {\n outward = vec3<f32>(0.0, 0.0, select(-1.0, 1.0, rel.z >= 0.0));\n }\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, outward) < 0.0);\n let normal = select(-outward, outward, frontFace == 1u);\n return surface_candidate(\n distance,\n normal,\n normal,\n vec3<f32>(1.0, 0.0, 0.0),\n vec2<f32>(0.0),\n frontFace,\n 0xffffffffu,\n object.objectId,\n object.objectId,\n object.mediumRefId\n );\n}\n\nfn intersect_bounds(ray: RayRecord, boundsMin: vec3<f32>, boundsMax: vec3<f32>, nearest: f32) -> bool {\n let inv = vec3<f32>(\n safe_inverse(ray.direction.x),\n safe_inverse(ray.direction.y),\n safe_inverse(ray.direction.z)\n );\n let t0 = (boundsMin - ray.origin.xyz) * inv;\n let t1 = (boundsMax - ray.origin.xyz) * inv;\n let tNear = min(t0, t1);\n let tFar = max(t0, t1);\n let entry = max(max(tNear.x, tNear.y), tNear.z);\n let exit = min(min(tFar.x, tFar.y), tFar.z);\n return exit >= max(entry, 0.001) && entry <= nearest;\n}\n\nfn repair_shading_normal(geometricNormal: vec3<f32>, shadingNormal: vec3<f32>) -> vec3<f32> {\n var normal = safe_normalize(shadingNormal, geometricNormal);\n if (dot(normal, geometricNormal) < 0.0) {\n normal = -normal;\n }\n return normal;\n}\n\nfn no_candidate() -> Candidate {\n return Candidate(\n 0u,\n 0.0,\n vec3<f32>(0.0, 1.0, 0.0),\n vec3<f32>(0.0, 1.0, 0.0),\n vec3<f32>(0.0),\n vec2<f32>(0.0),\n 1u,\n 0xffffffffu,\n 0xffffffffu,\n 0u,\n 0u\n );\n}\n\nfn surface_candidate(\n distance: f32,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n barycentric: vec3<f32>,\n uv: vec2<f32>,\n frontFace: u32,\n triangleIndex: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32\n) -> Candidate {\n return Candidate(\n 1u,\n distance,\n geometricNormal,\n shadingNormal,\n barycentric,\n uv,\n frontFace,\n triangleIndex,\n primitiveId,\n materialRefId,\n mediumRefId\n );\n}\n\nfn intersect_triangle(ray: RayRecord, triangle: TriangleRecord, triangleIndex: u32) -> Candidate {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n let pvec = cross(ray.direction.xyz, edge2);\n let det = dot(edge1, pvec);\n if (abs(det) < 0.0000001) {\n return no_candidate();\n }\n\n let invDet = 1.0 / det;\n let tvec = ray.origin.xyz - triangle.v0.xyz;\n let u = dot(tvec, pvec) * invDet;\n if (u < 0.0 || u > 1.0) {\n return no_candidate();\n }\n\n let qvec = cross(tvec, edge1);\n let v = dot(ray.direction.xyz, qvec) * invDet;\n if (v < 0.0 || u + v > 1.0) {\n return no_candidate();\n }\n\n let distance = dot(edge2, qvec) * invDet;\n if (distance <= 0.001) {\n return no_candidate();\n }\n\n let geometric = safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, geometric) < 0.0);\n let orientedGeometric = select(-geometric, geometric, frontFace == 1u);\n let w = 1.0 - u - v;\n let interpolated =\n triangle.n0.xyz * w +\n triangle.n1.xyz * u +\n triangle.n2.xyz * v;\n let shading = repair_shading_normal(orientedGeometric, interpolated);\n let barycentric = vec3<f32>(w, u, v);\n let uv =\n triangle.uv0uv1.xy * w +\n triangle.uv0uv1.zw * u +\n triangle.uv2Pad.xy * v;\n return surface_candidate(\n distance,\n orientedGeometric,\n shading,\n barycentric,\n uv,\n frontFace,\n triangleIndex,\n triangle.triangleId,\n triangle.materialRefId,\n triangle.mediumRefId\n );\n}\n\nfn intersect_bvh(ray: RayRecord, initialNearest: f32) -> Candidate {\n var nearest = initialNearest;\n var best = no_candidate();\n if (config.bvhNodeCount == 0u || config.triangleCount == 0u) {\n return best;\n }\n\n var stack = array<u32, 64>();\n var stackSize = 1u;\n stack[0] = 0u;\n\n loop {\n if (stackSize == 0u) {\n break;\n }\n\n stackSize = stackSize - 1u;\n let nodeIndex = stack[stackSize];\n if (nodeIndex >= config.bvhNodeCount) {\n continue;\n }\n\n let node = bvhNodes[nodeIndex];\n if (!intersect_bounds(ray, node.boundsMin.xyz, node.boundsMax.xyz, nearest)) {\n continue;\n }\n\n if (node.triangleCount > 0u) {\n for (var offset = 0u; offset < node.triangleCount; offset = offset + 1u) {\n let triangleIndex = node.childOrFirst + offset;\n if (triangleIndex >= config.triangleCount) {\n continue;\n }\n let current = intersect_triangle(ray, triangles[triangleIndex], triangleIndex);\n if (current.hit == 1u && current.distance < nearest) {\n nearest = current.distance;\n best = current;\n }\n }\n } else {\n if (stackSize + 2u <= 64u) {\n stack[stackSize] = node.childOrFirst;\n stack[stackSize + 1u] = node.rightChild;\n stackSize = stackSize + 2u;\n }\n }\n }\n\n return best;\n}\n`;\n","export const WAVEFRONT_SHADER_KERNELS_WGSL = `\nfn emission_power(emission: vec4<f32>) -> f32 {\n return emission.x + emission.y + emission.z;\n}\n\nfn sample_weight() -> f32 {\n return max(config.projectionAndSampling.z, 0.000001);\n}\n\nfn sanitize_linear_radiance_component(value: f32) -> f32 {\n let resolved = select(0.0, value, value == value);\n return clamp(resolved, 0.0, 65504.0);\n}\n\nfn sanitize_linear_radiance(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n sanitize_linear_radiance_component(value.x),\n sanitize_linear_radiance_component(value.y),\n sanitize_linear_radiance_component(value.z)\n );\n}\n\nfn radiance_sample_is_invalid(value: vec3<f32>) -> bool {\n return\n value.x != value.x || value.y != value.y || value.z != value.z ||\n value.x < 0.0 || value.y < 0.0 || value.z < 0.0 ||\n abs(value.x) > 65504.0 || abs(value.y) > 65504.0 || abs(value.z) > 65504.0;\n}\n\nfn radiance_sample_exceeds_legacy_clamp(value: vec3<f32>) -> bool {\n return value.x > 4.0 || value.y > 4.0 || value.z > 4.0;\n}\n\nfn record_radiance_diagnostics(sample: vec3<f32>) {\n if (radiance_sample_is_invalid(sample)) {\n atomicAdd(&counters.termination.invalidSampleCount, 1u);\n }\n if (radiance_sample_exceeds_legacy_clamp(sample)) {\n atomicAdd(&counters.termination.legacyClampEquivalentCount, 1u);\n }\n}\n\nfn tone_map_radiance(value: vec3<f32>) -> vec3<f32> {\n let mapped = value / (vec3<f32>(1.0) + value);\n return pow(clamp(mapped, vec3<f32>(0.0), vec3<f32>(1.0)), vec3<f32>(1.0 / 2.2));\n}\n\nfn present_radiance(value: vec3<f32>) -> vec3<f32> {\n let linearOutput = clamp(sanitize_linear_radiance(value), vec3<f32>(0.0), vec3<f32>(1.0));\n return select(tone_map_radiance(value), linearOutput, config.pathResolveSettings.w > 0.5);\n}\n\nfn scaled_termination_luminance(radiance: vec3<f32>) -> u32 {\n let averageLuminance =\n radiance_luminance(max(radiance, vec3<f32>(0.0))) / max(f32(config.tilePixelCount), 1.0);\n return u32(min(4294967295.0, round(averageLuminance * TERMINATION_LUMINANCE_SCALE)));\n}\n\nfn record_transport_contribution(kind: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n if (kind == TRANSPORT_BUCKET_DIRECT_EXPLICIT) {\n atomicAdd(&counters.termination.transportDirectExplicitLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TRANSPORT_BUCKET_CACHED_INDIRECT) {\n atomicAdd(&counters.termination.transportCachedIndirectLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL) {\n atomicAdd(&counters.termination.transportResidualLuminanceScaled, scaledLuminance);\n }\n}\n\nfn record_transport_checksum(pixelIndex: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n let weighted = (pixelIndex + 1u) * 2654435761u + (scaledLuminance + 1u) * 2246822519u;\n atomicAdd(&counters.termination.transportChecksum, weighted);\n}\n\nfn record_termination_metrics(kind: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n atomicAdd(&counters.termination.totalTerminalLuminanceScaled, scaledLuminance);\n if (\n max_component(radiance) <= 0.000001 &&\n (\n kind == TERMINAL_SOURCE_KIND_ABSORPTION_NULL ||\n kind == TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE ||\n kind == TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT ||\n kind == TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW ||\n kind == TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO\n )\n ) {\n atomicAdd(&counters.termination.transportZeroTerminationCount, 1u);\n }\n if (kind == TERMINAL_SOURCE_KIND_EMISSIVE) {\n atomicAdd(&counters.termination.emissiveCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_ENVIRONMENT) {\n atomicAdd(&counters.termination.environmentCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH) {\n atomicAdd(&counters.termination.ambientMaxDepthCount, 1u);\n atomicAdd(&counters.termination.ambientResidualLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW) {\n atomicAdd(&counters.termination.ambientQueueOverflowCount, 1u);\n atomicAdd(&counters.termination.ambientResidualLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_ABSORPTION_NULL) {\n atomicAdd(&counters.termination.absorptionNullCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE) {\n atomicAdd(&counters.termination.russianRouletteCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT) {\n atomicAdd(&counters.termination.strictMaxDepthCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO) {\n atomicAdd(&counters.termination.deterministicResidualZeroCount, 1u);\n return;\n }\n}\n\nfn ray_workgroups_for_count(rayCount: u32) -> u32 {\n return max(1u, (rayCount + 63u) / 64u);\n}\n\nfn write_active_dispatch_args(activeCount: u32) {\n counters.dispatchX = ray_workgroups_for_count(activeCount);\n counters.dispatchY = 1u;\n counters.dispatchZ = 1u;\n counters.dispatchPad = 0u;\n}\n\nfn denoise_range_space(value: vec3<f32>) -> vec3<f32> {\n return value / (vec3<f32>(1.0) + value);\n}\n\nfn denoise_sample_count() -> f32 {\n return clamp(1.0 / max(config.projectionAndSampling.z, 0.000001), 1.0, 256.0);\n}\n\nfn denoise_strength() -> f32 {\n let spp = denoise_sample_count();\n return clamp(0.44 / sqrt(spp), 0.08, 0.44);\n}\n\nfn denoise_kernel_radius() -> i32 {\n return select(1i, 2i, denoise_sample_count() < 2.5);\n}\n\n@compute @workgroup_size(64)\nfn generatePrimaryRays(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n if (index == 0u) {\n atomicStore(&counters.activeCount, config.tilePixelCount);\n atomicStore(&counters.nextCount, 0u);\n atomicStore(&counters.terminatedCount, 0u);\n atomicStore(&counters.hitCount, 0u);\n atomicStore(&counters.termination.emissiveCount, 0u);\n atomicStore(&counters.termination.environmentCount, 0u);\n atomicStore(&counters.termination.ambientMaxDepthCount, 0u);\n atomicStore(&counters.termination.ambientQueueOverflowCount, 0u);\n atomicStore(&counters.termination.ambientResidualLuminanceScaled, 0u);\n atomicStore(&counters.termination.totalTerminalLuminanceScaled, 0u);\n atomicStore(&counters.termination.invalidSampleCount, 0u);\n atomicStore(&counters.termination.legacyClampEquivalentCount, 0u);\n atomicStore(&counters.termination.absorptionNullCount, 0u);\n atomicStore(&counters.termination.russianRouletteCount, 0u);\n atomicStore(&counters.termination.strictMaxDepthCount, 0u);\n atomicStore(&counters.termination.deterministicResidualZeroCount, 0u);\n atomicStore(&counters.termination.transportDirectExplicitLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportCachedIndirectLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportResidualLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportZeroTerminationCount, 0u);\n atomicStore(&counters.termination.transportChecksum, 0u);\n atomicStore(&counters.termination.transportPad0, 0u);\n atomicStore(&counters.termination.transportPad1, 0u);\n atomicStore(&counters.termination.transportPad2, 0u);\n write_active_dispatch_args(config.tilePixelCount);\n }\n if (index >= config.tilePixelCount) {\n return;\n }\n activeQueue[index] = make_ray(index);\n clear_deferred_path(index);\n if (u32(config.projectionAndSampling.w) == 0u) {\n accumulation[index] = vec4<f32>(0.0);\n }\n}\n\n@compute @workgroup_size(64)\nfn intersectActiveQueue(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let activeCount = atomicLoad(&counters.activeCount);\n if (index >= activeCount) {\n return;\n }\n let ray = activeQueue[index];\n var nearest = 1000000.0;\n var hitObject = SceneObject(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(1.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(0.08, 1.0, 0.0, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0)\n );\n var candidate = no_candidate();\n var hitTriangle = TriangleRecord();\n\n for (var objectIndex = 0u; objectIndex < config.sceneObjectCount; objectIndex = objectIndex + 1u) {\n let object = sceneObjects[objectIndex];\n var current = no_candidate();\n if (object.kind == 1u) {\n current = intersect_sphere(ray, object);\n } else if (object.kind == 2u) {\n current = intersect_box(ray, object);\n }\n if (current.hit == 1u && current.distance < nearest) {\n nearest = current.distance;\n hitObject = object;\n candidate = current;\n }\n }\n\n let meshCandidate = intersect_bvh(ray, nearest);\n if (meshCandidate.hit == 1u && meshCandidate.distance < nearest) {\n nearest = meshCandidate.distance;\n candidate = meshCandidate;\n hitTriangle = triangles[meshCandidate.triangleIndex];\n }\n\n if (candidate.hit == 0u) {\n hits[index] = make_miss(ray);\n return;\n }\n\n let position = ray.origin.xyz + ray.direction.xyz * candidate.distance;\n let hitMaterialKind = select(hitObject.materialKind, hitTriangle.materialKind, candidate.triangleIndex != 0xffffffffu);\n let hitObjectId = select(hitObject.objectId, hitTriangle.meshId, candidate.triangleIndex != 0xffffffffu);\n let meshSurface = sample_surface_material(\n hitTriangle,\n candidate.uv,\n candidate.geometricNormal,\n candidate.shadingNormal\n );\n let hitColor = select(hitObject.color, meshSurface.color, candidate.triangleIndex != 0xffffffffu);\n let hitEmission = select(hitObject.emission, meshSurface.emission, candidate.triangleIndex != 0xffffffffu);\n let hitMaterial = select(hitObject.material, meshSurface.material, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialResponse = select(hitObject.materialResponse, meshSurface.materialResponse, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialExtension = select(hitObject.materialExtension, meshSurface.materialExtension, candidate.triangleIndex != 0xffffffffu);\n let hitSpecularColor = select(hitObject.specularColor, meshSurface.specularColor, candidate.triangleIndex != 0xffffffffu);\n let hitShadingNormal = select(candidate.shadingNormal, meshSurface.shadingNormal, candidate.triangleIndex != 0xffffffffu);\n let hitPrimitiveId = select(candidate.primitiveId, hitTriangle.triangleId, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialRefId = select(candidate.materialRefId, hitTriangle.materialRefId, candidate.triangleIndex != 0xffffffffu);\n let hitMediumRefId = select(candidate.mediumRefId, hitTriangle.mediumRefId, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialSlot = select(0u, hitTriangle.materialSlot, candidate.triangleIndex != 0xffffffffu);\n let hitOcclusion = select(1.0, meshSurface.occlusion, candidate.triangleIndex != 0xffffffffu);\n var hitType = 0u;\n if (hitMaterialKind == 4u || emission_power(hitEmission) > 0.0001) {\n hitType = 1u;\n } else if (hitMaterialKind == 3u || hitMaterial.z < 0.999 || hitMaterialExtension.z > 0.001) {\n hitType = 3u;\n }\n atomicAdd(&counters.hitCount, 1u);\n hits[index] = HitRecord(\n ray.rayId,\n ray.sourcePixelId,\n hitType,\n hitObjectId,\n hitMaterialKind,\n candidate.frontFace,\n hitPrimitiveId,\n hitMaterialRefId,\n hitMediumRefId,\n hitMaterialSlot,\n 0u,\n 0u,\n candidate.distance,\n hitOcclusion,\n vec2<f32>(0.0),\n vec4<f32>(position, 1.0),\n vec4<f32>(candidate.geometricNormal, 0.0),\n vec4<f32>(hitShadingNormal, 0.0),\n vec4<f32>(candidate.barycentric, 0.0),\n vec4<f32>(candidate.uv, 0.0, 0.0),\n hitColor,\n hitEmission,\n hitMaterial,\n hitMaterialResponse,\n hitMaterialExtension,\n hitSpecularColor\n );\n}\n\nfn surface_shading_normal(hit: HitRecord) -> vec3<f32> {\n let geometric = safe_normalize(hit.geometricNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n return repair_shading_normal(geometric, hit.shadingNormal.xyz);\n}\n\nfn offset_origin(\n position: vec3<f32>,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n rayDirection: vec3<f32>\n) -> vec3<f32> {\n let geometric = safe_normalize(geometricNormal, vec3<f32>(0.0, 1.0, 0.0));\n let shading = repair_shading_normal(geometric, shadingNormal);\n let raySide = select(-1.0, 1.0, dot(rayDirection, geometric) >= 0.0);\n let orientedGeometric = geometric * raySide;\n var orientedShading = shading * raySide;\n if (dot(orientedShading, orientedGeometric) <= 0.0) {\n orientedShading = orientedGeometric;\n }\n let offsetNormal = safe_normalize(orientedGeometric + orientedShading, orientedGeometric);\n let positionScale = max(max(abs(position.x), abs(position.y)), abs(position.z));\n let positionAwareEpsilon = positionScale * 0.00000047683716;\n let offsetDistance = clamp(max(0.00025, positionAwareEpsilon), 0.00025, 0.01);\n return position + offsetNormal * offsetDistance;\n}\n\nfn schlick(cosine: f32, refractionRatio: f32) -> f32 {\n var r0 = (1.0 - refractionRatio) / (1.0 + refractionRatio);\n r0 = r0 * r0;\n return r0 + (1.0 - r0) * pow(1.0 - cosine, 5.0);\n}\n\nfn refract_direction(unitDirection: vec3<f32>, normal: vec3<f32>, etaRatio: f32) -> vec3<f32> {\n let cosTheta = min(dot(-unitDirection, normal), 1.0);\n let rOutPerp = etaRatio * (unitDirection + cosTheta * normal);\n let rOutParallel = -sqrt(abs(1.0 - dot(rOutPerp, rOutPerp))) * normal;\n return safe_normalize(rOutPerp + rOutParallel, reflect(unitDirection, normal));\n}\n\nfn surface_supports_direct_lighting(hit: HitRecord) -> bool {\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let deltaMetal = hit.materialKind == 1u && roughness <= 0.02;\n let refractive = hit.materialKind == 2u || hit.materialKind == 3u || transmission > 0.001;\n return !(deltaMetal || refractive);\n}\n\nfn sample_emissive_triangle_direction(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n fallback: vec3<f32>\n) -> vec3<f32> {\n let lightSample = sample_emissive_triangle_light(\n hit,\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n SAMPLE_DIM_GUIDED_EMISSIVE_SELECTION,\n SAMPLE_DIM_GUIDED_EMISSIVE_SURFACE\n );\n if (lightSample.valid == 0u) {\n return fallback;\n }\n return safe_normalize(lightSample.direction.xyz, fallback);\n}\n\nfn sample_environment_portal_direction(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n fallback: vec3<f32>\n) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return fallback;\n }\n let portalSlot = min(\n u32(\n sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, SAMPLE_DIM_GUIDED_PORTAL_SELECTION) *\n f32(config.environmentPortalCount)\n ),\n config.environmentPortalCount - 1u\n );\n let portal = environmentPortals[portalSlot];\n let portalUv = sample_dimension_2d(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n SAMPLE_DIM_GUIDED_PORTAL_SURFACE,\n config.samplesPerPixel\n ) * 2.0 - vec2<f32>(1.0);\n let u = portalUv.x * portal.tangent.w;\n let v = portalUv.y * portal.bitangent.w;\n let portalTarget = portal.position.xyz + portal.tangent.xyz * u + portal.bitangent.xyz * v;\n return safe_normalize(portalTarget - hit.position.xyz, fallback);\n}\n\nfn scatter_direction(ray: RayRecord, hit: HitRecord) -> ScatterResult {\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n if (hit.materialKind == 1u && roughness <= 0.02) {\n return ScatterResult(\n vec4<f32>(reflect(ray.direction.xyz, normal), 0.0),\n 1.0,\n ray.mediumRefId,\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_REFLECTION,\n );\n }\n\n if (hit.materialKind == 2u || hit.materialKind == 3u || transmission > 0.001) {\n let ior = max(hit.material.w, 1.01);\n let etaRatio = select(ior, 1.0 / ior, hit.frontFace == 1u);\n let cosTheta = min(dot(-ray.direction.xyz, normal), 1.0);\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let cannotRefract = etaRatio * sinTheta > 1.0;\n let reflectChance = schlick(cosTheta, etaRatio);\n let transmissionReflectChance = select(\n reflectChance,\n max(reflectChance, 1.0 - transmission),\n transmission > 0.001\n );\n let transmissionSelector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_TRANSMISSION_SELECTOR\n );\n if (cannotRefract || transmissionSelector < transmissionReflectChance) {\n return ScatterResult(\n vec4<f32>(reflect(ray.direction.xyz, normal), 0.0),\n 1.0,\n ray.mediumRefId,\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_REFLECTION,\n );\n }\n return ScatterResult(\n vec4<f32>(refract_direction(ray.direction.xyz, normal, etaRatio), 0.0),\n 1.0,\n transmitted_medium_ref_id(ray, hit),\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_TRANSMISSION,\n );\n }\n\n let guidedEmissiveAvailable = config.emissiveTriangleCount > 0u;\n let guidedPortalAvailable =\n config.environmentPortalCount > 0u && config.environmentPortalMode != 0u;\n let guidedSelector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_GUIDED_LIGHT_SELECTOR\n );\n if (guidedEmissiveAvailable && guidedSelector < 0.18) {\n let guidedDirection = sample_emissive_triangle_direction(\n hit,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n normal\n );\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(\n vec4<f32>(guidedDirection, 0.0),\n guidedPdf,\n ray.mediumRefId,\n RAY_FLAG_GUIDED_EMISSIVE,\n SCATTER_LOBE_DIFFUSE,\n );\n }\n }\n if (guidedPortalAvailable && guidedSelector < 0.32) {\n let guidedDirection = sample_environment_portal_direction(\n hit,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n normal\n );\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(\n vec4<f32>(guidedDirection, 0.0),\n guidedPdf,\n ray.mediumRefId,\n 0u,\n SCATTER_LOBE_DIFFUSE\n );\n }\n }\n\n let weights = surface_bsdf_sampling_weights(hit);\n let selector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_BSDF_LOBE_SELECTOR\n );\n var lightDirection = normal;\n var lobeKind = SCATTER_LOBE_DIFFUSE;\n if (selector < weights.x) {\n let diffuseSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_DIFFUSE_HEMISPHERE,\n config.samplesPerPixel\n );\n lightDirection = cosine_sample_hemisphere(\n diffuseSample,\n normal\n );\n lobeKind = SCATTER_LOBE_DIFFUSE;\n } else if (selector < weights.x + weights.y) {\n let specularSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_SPECULAR_HALF_VECTOR,\n config.samplesPerPixel\n );\n let halfVector = importance_sample_ggx(\n specularSample,\n max(roughness, 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n lobeKind = SCATTER_LOBE_SPECULAR;\n } else {\n let clearcoatSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_CLEARCOAT_HALF_VECTOR,\n config.samplesPerPixel\n );\n let halfVector = importance_sample_ggx(\n clearcoatSample,\n max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n lobeKind = SCATTER_LOBE_CLEARCOAT;\n }\n if (dot(normal, lightDirection) <= 0.000001) {\n let fallbackSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_FALLBACK_HEMISPHERE,\n config.samplesPerPixel\n );\n lightDirection = cosine_sample_hemisphere(\n fallbackSample,\n normal\n );\n lobeKind = SCATTER_LOBE_DIFFUSE;\n }\n let pdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, lightDirection), 0.000001);\n return ScatterResult(vec4<f32>(lightDirection, 0.0), pdf, ray.mediumRefId, 0u, lobeKind);\n}\n\n@compute @workgroup_size(64)\nfn resolveSurfaceRecords(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let activeCount = atomicLoad(&counters.activeCount);\n if (index >= activeCount) {\n return;\n }\n\n let ray = activeQueue[index];\n let hit = hits[index];\n let segmentTransmittance = medium_transmittance(medium_stack_current_id(ray), hit.distance);\n let arrivingThroughput = ray.throughput.xyz * segmentTransmittance;\n var contribution = vec3<f32>(0.0);\n\n if (hit.hitType == 1u) {\n let guidedLightWeight = select(1.0, 0.24, (ray.flags & RAY_FLAG_GUIDED_EMISSIVE) != 0u);\n var sourceRadiance = max(hit.emission.xyz, hit.color.xyz) * guidedLightWeight;\n if ((ray.flags & RAY_FLAG_DELTA_SAMPLE) == 0u) {\n let bsdfPdf = max(ray.throughput.w, 0.000001);\n let lightPdf = terminal_emissive_light_pdf(ray, hit);\n if (lightPdf > 0.000001) {\n sourceRadiance = sourceRadiance * power_heuristic(bsdfPdf, lightPdf);\n }\n }\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n sourceRadiance * segmentTransmittance,\n TERMINAL_SOURCE_KIND_EMISSIVE\n );\n } else {\n let rawWeightedContribution = arrivingThroughput * sourceRadiance * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_EMISSIVE, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n if (hit.hitType == 2u) {\n var sourceRadiance = hit.color.xyz;\n if ((ray.flags & RAY_FLAG_DELTA_SAMPLE) == 0u) {\n let bsdfPdf = max(ray.throughput.w, 0.000001);\n let lightPdf = environment_direction_pdf(ray.direction.xyz);\n let misWeight = power_heuristic(bsdfPdf, lightPdf);\n sourceRadiance = sourceRadiance * misWeight;\n }\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n sourceRadiance * segmentTransmittance,\n TERMINAL_SOURCE_KIND_ENVIRONMENT\n );\n } else {\n let rawWeightedContribution = arrivingThroughput * sourceRadiance * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_ENVIRONMENT, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let shouldEstimateDirectLight = surface_supports_direct_lighting(hit);\n if (shouldEstimateDirectLight) {\n let directLight = surface_direct_light_contribution(\n RayRecord(\n ray.rayId,\n ray.parentRayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n ray.mediumRefId,\n ray.flags,\n ray.mediumStackDepth,\n ray.origin,\n ray.direction,\n vec4<f32>(arrivingThroughput, ray.throughput.w),\n ray.mediumStack\n ),\n hit\n );\n let sunLight = surface_procedural_sun_contribution(\n RayRecord(\n ray.rayId,\n ray.parentRayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n ray.mediumRefId,\n ray.flags,\n ray.mediumStackDepth,\n ray.origin,\n ray.direction,\n vec4<f32>(arrivingThroughput, ray.throughput.w),\n ray.mediumStack\n ),\n hit\n );\n let rawDirectLight = (directLight + sunLight) * sample_weight();\n record_radiance_diagnostics(rawDirectLight);\n let weightedDirectLight = sanitize_linear_radiance(rawDirectLight);\n record_transport_contribution(TRANSPORT_BUCKET_DIRECT_EXPLICIT, weightedDirectLight);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedDirectLight, 0.0);\n }\n\n if (ray.bounce + 1u >= config.maxDepth) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH\n );\n }\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n let rawWeightedContribution = terminalEnvironment * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let scatter = scatter_direction(ray, hit);\n let continuationNormal = surface_shading_normal(hit);\n let continuationViewDirection = safe_normalize(-ray.direction.xyz, continuationNormal);\n let continuationLightDirection = safe_normalize(scatter.direction.xyz, continuationNormal);\n var continuationThroughput = surface_continuation_throughput(\n hit,\n continuationViewDirection,\n continuationLightDirection,\n scatter\n ) * segmentTransmittance;\n if (max_component(continuationThroughput) <= 0.000001) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_ABSORPTION_NULL\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH\n );\n }\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n let rawWeightedContribution = terminalEnvironment * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n let rouletteStartBounce = select(\n 2u,\n 6u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DEFER_LOW_SPP_RUSSIAN_ROULETTE) &&\n config.samplesPerPixel <= 8u\n );\n if (strict_physical_low_spp_lighting_enabled() && ray.bounce >= rouletteStartBounce) {\n let survivalProbability = clamp(max_component(continuationThroughput), 0.05, 0.95);\n let roulette = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_RUSSIAN_ROULETTE\n );\n if (roulette > survivalProbability) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE\n );\n } else {\n record_termination_metrics(TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE, vec3<f32>(0.0));\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n continuationThroughput = continuationThroughput / survivalProbability;\n }\n let nextIndex = atomicAdd(&counters.nextCount, 1u);\n if (nextIndex >= config.tilePixelCount) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW\n );\n }\n } else {\n var rawWeightedContribution = vec3<f32>(0.0);\n if (\n !strict_physical_low_spp_lighting_enabled() ||\n !transport_experiment_enabled(TRANSPORT_EXPERIMENT_STRICT_ZERO_OVERFLOW)\n ) {\n let overflowEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n rawWeightedContribution = overflowEnvironment * sample_weight();\n }\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW,\n weightedContribution\n );\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n record_deferred_path_throughput(ray, continuationThroughput);\n let throughput = ray.throughput.xyz * continuationThroughput;\n let transmissionBranch = scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION;\n let nextMediumStack = select(\n transitioned_medium_stack(ray, hit),\n ray.mediumStack,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n let nextMediumStackDepth = select(\n transitioned_medium_stack_depth(ray, hit),\n ray.mediumStackDepth,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n let nextMediumRefId = select(\n transmitted_medium_ref_id(ray, hit),\n ray.mediumRefId,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n nextQueue[nextIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n nextMediumRefId,\n scatter.flags,\n nextMediumStackDepth,\n vec4<f32>(\n offset_origin(\n hit.position.xyz,\n hit.geometricNormal.xyz,\n hit.shadingNormal.xyz,\n scatter.direction.xyz\n ),\n 1.0\n ),\n scatter.direction,\n vec4<f32>(throughput, scatter.pdf),\n nextMediumStack\n );\n\n // Keep both sides of a dielectric event when queue capacity permits. The\n // selected continuation remains the primary sample; this bounded second\n // record preserves a reflected/transmitted branch for explicit transport.\n if (\n scatter.lobeKind == SCATTER_LOBE_DELTA_REFLECTION ||\n scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION\n ) {\n let secondaryIndex = atomicAdd(&counters.nextCount, 1u);\n if (secondaryIndex < config.tilePixelCount) {\n let secondaryIsReflection = transmissionBranch;\n let secondaryDirection = select(\n refract_direction(ray.direction.xyz, surface_shading_normal(hit),\n select(1.0 / max(hit.material.w, 1.01), max(hit.material.w, 1.01), hit.frontFace == 1u)),\n reflect(ray.direction.xyz, surface_shading_normal(hit)),\n secondaryIsReflection\n );\n let secondaryThroughput = select(\n surface_delta_transmission_throughput(hit, continuationViewDirection),\n surface_delta_reflection_throughput(hit, continuationViewDirection),\n secondaryIsReflection\n ) * segmentTransmittance;\n let secondaryStack = select(\n transitioned_medium_stack(ray, hit),\n ray.mediumStack,\n secondaryIsReflection\n );\n let secondaryDepth = select(\n transitioned_medium_stack_depth(ray, hit),\n ray.mediumStackDepth,\n secondaryIsReflection\n );\n let secondaryMedium = select(\n transmitted_medium_ref_id(ray, hit),\n ray.mediumRefId,\n secondaryIsReflection\n );\n nextQueue[secondaryIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n secondaryMedium,\n scatter.flags,\n secondaryDepth,\n vec4<f32>(\n offset_origin(\n hit.position.xyz,\n hit.geometricNormal.xyz,\n hit.shadingNormal.xyz,\n secondaryDirection\n ),\n 1.0\n ),\n vec4<f32>(secondaryDirection, 0.0),\n vec4<f32>(ray.throughput.xyz * secondaryThroughput, scatter.pdf),\n secondaryStack\n );\n }\n }\n}\n\n@compute @workgroup_size(1)\nfn compactAndSwapQueues(@builtin(global_invocation_id) globalId: vec3<u32>) {\n if (globalId.x > 0u) {\n return;\n }\n let nextCount = atomicLoad(&counters.nextCount);\n let activeCount = min(nextCount, config.tilePixelCount);\n atomicStore(&counters.activeCount, activeCount);\n atomicStore(&counters.nextCount, 0u);\n write_active_dispatch_args(activeCount);\n}\n\nfn resolve_deferred_path_radiance(rayId: u32) -> vec3<f32> {\n let terminal = pathVertices[path_vertex_index(rayId, config.maxDepth)];\n if (terminal.w <= 0.0) {\n return vec3<f32>(0.0);\n }\n\n var radiance = terminal.xyz;\n var depth = config.maxDepth;\n loop {\n if (depth == 0u) {\n break;\n }\n depth = depth - 1u;\n let throughput = pathVertices[path_vertex_index(rayId, depth)];\n if (throughput.w > 0.0) {\n radiance = radiance * throughput.xyz;\n }\n }\n return sanitize_linear_radiance(radiance);\n}\n\n@compute @workgroup_size(64)\nfn accumulateTerminalRadiance(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n if (index >= config.tilePixelCount) {\n return;\n }\n let localX = index % config.tileWidth;\n let localY = index / config.tileWidth;\n let pixel = vec2<i32>(i32(config.tileX + localX), i32(config.tileY + localY));\n var radiance = max(accumulation[index].xyz, vec3<f32>(0.0));\n if (deferred_path_resolve_enabled()) {\n let terminal = pathVertices[path_vertex_index(index, config.maxDepth)];\n let resolved = resolve_deferred_path_radiance(index) * sample_weight();\n record_radiance_diagnostics(resolved);\n let safeResolved = sanitize_linear_radiance(resolved);\n record_transport_contribution(TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL, safeResolved);\n record_termination_metrics(u32(terminal.w), safeResolved);\n radiance = sanitize_linear_radiance(radiance + safeResolved);\n accumulation[index] = vec4<f32>(radiance, 1.0);\n }\n\n let linearOutput = sanitize_linear_radiance(radiance);\n record_transport_checksum(index, linearOutput);\n textureStore(radianceImage, pixel, vec4<f32>(linearOutput, 1.0));\n if (config.denoise == 0u) {\n textureStore(outputImage, pixel, vec4<f32>(present_radiance(linearOutput), 1.0));\n }\n}\n\n@compute @workgroup_size(8, 8)\nfn denoiseLinearRadiance(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let x = globalId.x;\n let y = globalId.y;\n if (x >= config.canvasWidth || y >= config.canvasHeight) {\n return;\n }\n\n let pixel = vec2<i32>(i32(x), i32(y));\n let center = textureLoad(denoiseInputRadiance, pixel, 0).xyz;\n let strength = denoise_strength();\n let kernelRadius = denoise_kernel_radius();\n let centerWeight = 1.7 - strength * 0.35;\n var sum = center * centerWeight;\n var totalWeight = centerWeight;\n let centerRange = denoise_range_space(center);\n\n for (var oy = -2i; oy <= 2i; oy = oy + 1i) {\n for (var ox = -2i; ox <= 2i; ox = ox + 1i) {\n if (ox == 0i && oy == 0i) {\n continue;\n }\n if (abs(ox) > kernelRadius || abs(oy) > kernelRadius) {\n continue;\n }\n let sx = clamp(i32(x) + ox, 0i, i32(config.canvasWidth) - 1i);\n let sy = clamp(i32(y) + oy, 0i, i32(config.canvasHeight) - 1i);\n let sampleColor = textureLoad(denoiseInputRadiance, vec2<i32>(sx, sy), 0).xyz;\n let colorDistance = length(denoise_range_space(sampleColor) - centerRange);\n let rangeWeight = 1.0 / (1.0 + colorDistance * (11.0 + strength * 6.0));\n let distanceWeight = 1.0 / (1.0 + f32(ox * ox + oy * oy) * (0.62 + strength * 0.24));\n let diagonalWeight = select(1.0, 0.92, abs(ox) + abs(oy) > 1i);\n let weight = rangeWeight * diagonalWeight * distanceWeight;\n sum = sum + sampleColor * weight;\n totalWeight = totalWeight + weight;\n }\n }\n\n let filtered = sum / max(totalWeight, 0.0001);\n let outlier = saturate(length(denoise_range_space(center) - denoise_range_space(filtered)) * 2.1);\n let blend = min(0.3, strength * (0.62 + outlier * 0.12));\n let color = min(mix(center, filtered, blend), vec3<f32>(16.0));\n textureStore(denoisedRadianceImage, pixel, vec4<f32>(color, 1.0));\n}\n\n@compute @workgroup_size(8, 8)\nfn resolveDenoisedOutputImage(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let x = globalId.x;\n let y = globalId.y;\n if (x >= config.canvasWidth || y >= config.canvasHeight) {\n return;\n }\n\n let pixel = vec2<i32>(i32(x), i32(y));\n let center = textureLoad(finalDenoiseInputRadiance, pixel, 0).xyz;\n let strength = denoise_strength();\n let centerWeight = 1.35 - strength * 0.25;\n var sum = center * centerWeight;\n var totalWeight = centerWeight;\n let centerRange = denoise_range_space(center);\n\n for (var oy = -1i; oy <= 1i; oy = oy + 1i) {\n for (var ox = -1i; ox <= 1i; ox = ox + 1i) {\n if (ox == 0i && oy == 0i) {\n continue;\n }\n let sx = clamp(i32(x) + ox, 0i, i32(config.canvasWidth) - 1i);\n let sy = clamp(i32(y) + oy, 0i, i32(config.canvasHeight) - 1i);\n let sampleColor = textureLoad(finalDenoiseInputRadiance, vec2<i32>(sx, sy), 0).xyz;\n let colorDistance = length(denoise_range_space(sampleColor) - centerRange);\n let rangeWeight = 1.0 / (1.0 + colorDistance * (12.0 + strength * 8.0));\n let distanceWeight = 1.0 / (1.0 + f32(ox * ox + oy * oy) * (0.82 + strength * 0.28));\n let weight = rangeWeight * distanceWeight;\n sum = sum + sampleColor * weight;\n totalWeight = totalWeight + weight;\n }\n }\n\n let filtered = sum / max(totalWeight, 0.0001);\n let outlier = saturate(length(denoise_range_space(center) - denoise_range_space(filtered)) * 2.2);\n let blend = min(0.18, strength * (0.42 + outlier * 0.08));\n let radiance = min(mix(center, filtered, blend), vec3<f32>(16.0));\n textureStore(denoisedOutputImage, pixel, vec4<f32>(present_radiance(radiance), 1.0));\n}\n`;\n","import { hashUint32, mixSeed, random01FromSeed } from \"./wavefront-core.js\";\n\nconst sampleDimensionEntries = Object.freeze([\n [\"cameraJitter\", 1],\n [\"transmissionSelector\", 11],\n [\"guidedLightSelector\", 12],\n [\"guidedEmissiveSelection\", 13],\n [\"guidedEmissiveSurface\", 14],\n [\"guidedPortalSelection\", 15],\n [\"guidedPortalSurface\", 16],\n [\"bsdfLobeSelector\", 21],\n [\"diffuseHemisphere\", 22],\n [\"specularHalfVector\", 23],\n [\"clearcoatHalfVector\", 24],\n [\"fallbackHemisphere\", 25],\n [\"russianRoulette\", 26],\n [\"emissiveLightSelection\", 31],\n [\"emissiveLightSurface\", 32],\n [\"directLightSelector\", 41],\n [\"directEnvironment\", 42],\n]);\n\nfunction toWgslConstName(name) {\n return `SAMPLE_DIM_${name.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toUpperCase()}`;\n}\n\nconst usedDimensions = new Set();\nfor (const [, dimension] of sampleDimensionEntries) {\n if (usedDimensions.has(dimension)) {\n throw new Error(`Duplicate wavefront sample dimension ${dimension}.`);\n }\n usedDimensions.add(dimension);\n}\n\nexport const WAVEFRONT_SAMPLE_DIMENSIONS = Object.freeze(\n Object.fromEntries(sampleDimensionEntries)\n);\n\nexport function listWavefrontSampleDimensions() {\n return sampleDimensionEntries.map(([name, dimension]) =>\n Object.freeze({\n name,\n dimension,\n wgslName: toWgslConstName(name),\n })\n );\n}\n\nexport const WAVEFRONT_SAMPLE_DIMENSIONS_WGSL = listWavefrontSampleDimensions()\n .map(({ wgslName, dimension }) => `const ${wgslName}: u32 = ${dimension}u;`)\n .join(\"\\n\");\n\nfunction fract(value) {\n return value - Math.floor(value);\n}\n\nexport function radicalInverseVdc(value) {\n let bits = value >>> 0;\n bits = ((bits << 16) | (bits >>> 16)) >>> 0;\n bits = (((bits & 0x55555555) << 1) | ((bits & 0xaaaaaaaa) >>> 1)) >>> 0;\n bits = (((bits & 0x33333333) << 2) | ((bits & 0xcccccccc) >>> 2)) >>> 0;\n bits = (((bits & 0x0f0f0f0f) << 4) | ((bits & 0xf0f0f0f0) >>> 4)) >>> 0;\n bits = (((bits & 0x00ff00ff) << 8) | ((bits & 0xff00ff00) >>> 8)) >>> 0;\n return bits / 0x100000000;\n}\n\nexport function sampleWavefrontDimension1D(pixelId, sampleId, bounce, frameIndex, dimension) {\n return random01FromSeed(mixSeed(pixelId, sampleId, bounce, frameIndex, dimension));\n}\n\nexport function sampleWavefrontDimension2D(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n dimension,\n strataCount\n) {\n const strata = Math.max(1, Number.isFinite(strataCount) ? Math.trunc(strataCount) : 1);\n const jitter = sampleWavefrontDimension1D(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n dimension\n );\n const scramble = hashUint32(mixSeed(pixelId, sampleId, bounce, frameIndex, dimension));\n const stratified = fract((((sampleId >>> 0) % strata) + jitter) / strata);\n const lowDiscrepancy = fract(radicalInverseVdc((sampleId >>> 0) ^ scramble) + jitter);\n return Object.freeze([stratified, lowDiscrepancy]);\n}\n","import { WAVEFRONT_SAMPLE_DIMENSIONS_WGSL } from \"./wavefront-sampling-dimensions.js\";\n\nexport const WAVEFRONT_SHADER_LAYOUT_WGSL = `\nconst RAY_FLAG_GUIDED_EMISSIVE: u32 = 1u;\nconst RAY_FLAG_DELTA_SAMPLE: u32 = 2u;\nconst DIRECT_LIGHT_FLAG_DELTA: u32 = 1u;\nconst DIRECT_LIGHT_FLAG_PHYSICAL_SUN: u32 = 2u;\nconst SCATTER_LOBE_DIFFUSE: u32 = 1u;\nconst SCATTER_LOBE_SPECULAR: u32 = 2u;\nconst SCATTER_LOBE_CLEARCOAT: u32 = 3u;\nconst SCATTER_LOBE_DELTA_REFLECTION: u32 = 4u;\nconst SCATTER_LOBE_DELTA_TRANSMISSION: u32 = 5u;\n${WAVEFRONT_SAMPLE_DIMENSIONS_WGSL}\n\nstruct RayRecord {\n rayId: u32,\n parentRayId: u32,\n sourcePixelId: u32,\n sampleId: u32,\n bounce: u32,\n mediumRefId: u32,\n flags: u32,\n mediumStackDepth: u32,\n origin: vec4<f32>,\n direction: vec4<f32>,\n throughput: vec4<f32>,\n mediumStack: vec4<u32>,\n};\n\nstruct HitRecord {\n rayId: u32,\n sourcePixelId: u32,\n hitType: u32,\n objectId: u32,\n materialKind: u32,\n frontFace: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32,\n materialSlot: u32,\n pad0: u32,\n pad1: u32,\n distance: f32,\n occlusion: f32,\n pad2: vec2<f32>,\n position: vec4<f32>,\n geometricNormal: vec4<f32>,\n shadingNormal: vec4<f32>,\n barycentric: vec4<f32>,\n uv: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n};\n\nstruct SceneObject {\n kind: u32,\n objectId: u32,\n materialKind: u32,\n flags: u32,\n mediumRefId: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n center: vec4<f32>,\n halfExtent: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n};\n\nstruct TriangleRecord {\n triangleId: u32,\n meshId: u32,\n materialKind: u32,\n flags: u32,\n materialRefId: u32,\n mediumRefId: u32,\n materialSlot: u32,\n pad1: u32,\n v0: vec4<f32>,\n v1: vec4<f32>,\n v2: vec4<f32>,\n n0: vec4<f32>,\n n1: vec4<f32>,\n n2: vec4<f32>,\n uv0uv1: vec4<f32>,\n uv2Pad: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n baseColorAtlas: vec4<f32>,\n metallicRoughnessAtlas: vec4<f32>,\n normalAtlas: vec4<f32>,\n occlusionAtlas: vec4<f32>,\n emissiveAtlas: vec4<f32>,\n textureSettings: vec4<f32>,\n materialExtension2: vec4<f32>,\n materialExtension3: vec4<f32>,\n clearcoatAtlas: vec4<f32>,\n clearcoatRoughnessAtlas: vec4<f32>,\n clearcoatNormalAtlas: vec4<f32>,\n transmissionAtlas: vec4<f32>,\n thicknessAtlas: vec4<f32>,\n sheenColorAtlas: vec4<f32>,\n sheenRoughnessAtlas: vec4<f32>,\n specularAtlas: vec4<f32>,\n specularColorAtlas: vec4<f32>,\n iridescenceAtlas: vec4<f32>,\n iridescenceThicknessAtlas: vec4<f32>,\n anisotropyAtlas: vec4<f32>,\n};\n\nstruct BvhNode {\n boundsMin: vec4<f32>,\n boundsMax: vec4<f32>,\n childOrFirst: u32,\n triangleCount: u32,\n rightChild: u32,\n pad0: u32,\n};\n\nstruct BvhLeafRef {\n key: u32,\n triangleIndex: u32,\n pad0: u32,\n pad1: u32,\n};\n\nstruct ScatterResult {\n direction: vec4<f32>,\n pdf: f32,\n mediumRefId: u32,\n flags: u32,\n lobeKind: u32,\n};\n\nstruct MeshVertex {\n position: vec4<f32>,\n normal: vec4<f32>,\n uv: vec4<f32>,\n};\n\nstruct MeshRange {\n meshId: u32,\n materialKind: u32,\n flags: u32,\n materialRefId: u32,\n mediumRefId: u32,\n firstIndex: u32,\n indexCount: u32,\n firstTriangle: u32,\n triangleCount: u32,\n firstVertex: u32,\n vertexCount: u32,\n materialSlot: u32,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n baseColorAtlas: vec4<f32>,\n metallicRoughnessAtlas: vec4<f32>,\n normalAtlas: vec4<f32>,\n occlusionAtlas: vec4<f32>,\n emissiveAtlas: vec4<f32>,\n textureSettings: vec4<f32>,\n};\n\nstruct FrameConfig {\n canvasWidth: u32,\n canvasHeight: u32,\n tileX: u32,\n tileY: u32,\n tileWidth: u32,\n tileHeight: u32,\n tilePixelCount: u32,\n maxDepth: u32,\n sceneObjectCount: u32,\n frameIndex: u32,\n denoise: u32,\n triangleCount: u32,\n bvhNodeCount: u32,\n displayQuality: u32,\n meshSourceCount: u32,\n bvhNodeCapacity: u32,\n cameraPosition: vec4<f32>,\n cameraForward: vec4<f32>,\n cameraRight: vec4<f32>,\n cameraUp: vec4<f32>,\n projectionAndSampling: vec4<f32>,\n environmentColor: vec4<f32>,\n ambientColor: vec4<f32>,\n environmentHorizonColor: vec4<f32>,\n environmentZenithColor: vec4<f32>,\n environmentSunDirectionIntensity: vec4<f32>,\n environmentSunColor: vec4<f32>,\n bvhBuildNodeStart: u32,\n bvhBuildNodeCount: u32,\n bvhSortItemCount: u32,\n emissiveTriangleCount: u32,\n environmentPortalCount: u32,\n environmentPortalMode: u32,\n samplesPerPixel: u32,\n transportExperimentFlags: u32,\n environmentMapSettings: vec4<f32>,\n pathResolveSettings: vec4<f32>,\n environmentMapMeta: vec4<f32>,\n};\n\nstruct TerminationMetrics {\n emissiveCount: atomic<u32>,\n environmentCount: atomic<u32>,\n ambientMaxDepthCount: atomic<u32>,\n ambientQueueOverflowCount: atomic<u32>,\n ambientResidualLuminanceScaled: atomic<u32>,\n totalTerminalLuminanceScaled: atomic<u32>,\n invalidSampleCount: atomic<u32>,\n legacyClampEquivalentCount: atomic<u32>,\n absorptionNullCount: atomic<u32>,\n russianRouletteCount: atomic<u32>,\n strictMaxDepthCount: atomic<u32>,\n deterministicResidualZeroCount: atomic<u32>,\n transportDirectExplicitLuminanceScaled: atomic<u32>,\n transportCachedIndirectLuminanceScaled: atomic<u32>,\n transportResidualLuminanceScaled: atomic<u32>,\n transportZeroTerminationCount: atomic<u32>,\n transportChecksum: atomic<u32>,\n transportPad0: atomic<u32>,\n transportPad1: atomic<u32>,\n transportPad2: atomic<u32>,\n};\n\nconst TERMINAL_SOURCE_KIND_EMISSIVE = 1u;\nconst TERMINAL_SOURCE_KIND_ENVIRONMENT = 2u;\nconst TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH = 3u;\nconst TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW = 4u;\nconst TERMINAL_SOURCE_KIND_ABSORPTION_NULL = 5u;\nconst TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE = 6u;\nconst TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT = 7u;\nconst TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO = 8u;\nconst TERMINATION_LUMINANCE_SCALE = 1000000.0;\nconst TRANSPORT_BUCKET_DIRECT_EXPLICIT = 1u;\nconst TRANSPORT_BUCKET_CACHED_INDIRECT = 2u;\nconst TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL = 3u;\nconst TRANSPORT_EXPERIMENT_STABLE_SAMPLE_ROUTING = 1u;\nconst TRANSPORT_EXPERIMENT_STRICT_ZERO_OVERFLOW = 2u;\nconst TRANSPORT_EXPERIMENT_DEFER_LOW_SPP_RUSSIAN_ROULETTE = 4u;\nconst TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING = 8u;\nconst TRANSPORT_EXPERIMENT_PRODUCT_STUDIO_IMPORTANCE = 16u;\nconst TRANSPORT_EXPERIMENT_PRODUCT_TRANSPORT_TELEMETRY = 32u;\nconst TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING = 64u;\nconst TRANSPORT_EXPERIMENT_DETERMINISTIC_LOW_SPP_INDIRECT = 128u;\n\nstruct Counters {\n activeCount: atomic<u32>,\n nextCount: atomic<u32>,\n terminatedCount: atomic<u32>,\n hitCount: atomic<u32>,\n dispatchX: u32,\n dispatchY: u32,\n dispatchZ: u32,\n dispatchPad: u32,\n termination: TerminationMetrics,\n};\n\nstruct Candidate {\n hit: u32,\n distance: f32,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n barycentric: vec3<f32>,\n uv: vec2<f32>,\n frontFace: u32,\n triangleIndex: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32,\n};\n\nstruct EnvironmentPortal {\n kind: u32,\n flags: u32,\n _pad0: u32,\n _pad1: u32,\n position: vec4<f32>,\n normal: vec4<f32>,\n tangent: vec4<f32>,\n bitangent: vec4<f32>,\n color: vec4<f32>,\n};\n\n@group(0) @binding(0) var<storage, read_write> activeQueue: array<RayRecord>;\n@group(0) @binding(1) var<storage, read_write> nextQueue: array<RayRecord>;\n@group(0) @binding(2) var<storage, read_write> hits: array<HitRecord>;\n@group(0) @binding(3) var<storage, read_write> accumulation: array<vec4<f32>>;\n@group(0) @binding(4) var<storage, read> sceneObjects: array<SceneObject>;\n@group(0) @binding(5) var<uniform> config: FrameConfig;\n@group(0) @binding(6) var<storage, read_write> counters: Counters;\n@group(0) @binding(7) var outputImage: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(8) var<storage, read_write> triangles: array<TriangleRecord>;\n@group(0) @binding(9) var<storage, read_write> bvhNodes: array<BvhNode>;\n@group(0) @binding(10) var<storage, read> meshVertices: array<MeshVertex>;\n@group(0) @binding(11) var<storage, read> meshIndices: array<u32>;\n@group(0) @binding(12) var<storage, read> meshRanges: array<MeshRange>;\n@group(0) @binding(13) var<storage, read_write> bvhLeafRefs: array<BvhLeafRef>;\n@group(0) @binding(14) var denoiseInputRadiance: texture_2d<f32>;\n@group(0) @binding(15) var denoisedRadianceImage: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(16) var radianceImage: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(17) var finalDenoiseInputRadiance: texture_2d<f32>;\n@group(0) @binding(18) var denoisedOutputImage: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(19) var<storage, read> environmentPortals: array<EnvironmentPortal>;\n@group(0) @binding(20) var environmentMapTexture: texture_2d<f32>;\n@group(0) @binding(21) var environmentMapSampler: sampler;\n@group(0) @binding(22) var<storage, read_write> pathVertices: array<vec4<f32>>;\n@group(0) @binding(23) var baseColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(24) var metallicRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(25) var normalAtlasTexture: texture_2d<f32>;\n@group(0) @binding(26) var occlusionAtlasTexture: texture_2d<f32>;\n@group(0) @binding(27) var emissiveAtlasTexture: texture_2d<f32>;\n@group(0) @binding(28) var materialAtlasSampler: sampler;\n@group(0) @binding(29) var brdfLutTexture: texture_2d<f32>;\n@group(0) @binding(30) var brdfLutSampler: sampler;\n@group(0) @binding(31) var environmentSamplingTexture: texture_2d<f32>;\n@group(0) @binding(32) var mediumTableTexture: texture_2d<f32>;\n@group(0) @binding(33) var clearcoatAtlasTexture: texture_2d<f32>;\n@group(0) @binding(34) var clearcoatRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(35) var clearcoatNormalAtlasTexture: texture_2d<f32>;\n@group(0) @binding(36) var transmissionAtlasTexture: texture_2d<f32>;\n@group(0) @binding(37) var thicknessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(38) var sheenColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(39) var sheenRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(40) var specularAtlasTexture: texture_2d<f32>;\n@group(0) @binding(41) var specularColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(42) var iridescenceAtlasTexture: texture_2d<f32>;\n@group(0) @binding(43) var iridescenceThicknessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(44) var anisotropyAtlasTexture: texture_2d<f32>;\n\nfn hash_u32(value: u32) -> u32 {\n var x = value;\n x = ((x >> 16u) ^ x) * 0x45d9f3bu;\n x = ((x >> 16u) ^ x) * 0x45d9f3bu;\n x = (x >> 16u) ^ x;\n return x;\n}\n\nfn mix_seed(pixelId: u32, sampleId: u32, bounce: u32, frameIndex: u32, dimension: u32) -> u32 {\n var x =\n (pixelId * 747796405u) ^\n (sampleId * 2891336453u) ^\n (bounce * 277803737u) ^\n (frameIndex * 1442695041u) ^\n (dimension * 1597334677u);\n x = x ^ (x >> 16u);\n x = x * 0x7feb352du;\n x = x ^ (x >> 15u);\n x = x * 0x846ca68bu;\n x = x ^ (x >> 16u);\n return x;\n}\n\nfn random01(seed: u32) -> f32 {\n return f32(hash_u32(seed) & 0x00ffffffu) / 16777215.0;\n}\n\nfn transport_experiment_enabled(bit: u32) -> bool {\n return (config.transportExperimentFlags & bit) != 0u;\n}\n\nfn sample_frame_index(frameIndex: u32) -> u32 {\n return select(frameIndex, 0u, transport_experiment_enabled(TRANSPORT_EXPERIMENT_STABLE_SAMPLE_ROUTING));\n}\n\nfn radical_inverse_vdc(bits: u32) -> f32 {\n var value = bits;\n value = (value << 16u) | (value >> 16u);\n value = ((value & 0x55555555u) << 1u) | ((value & 0xaaaaaaaau) >> 1u);\n value = ((value & 0x33333333u) << 2u) | ((value & 0xccccccccu) >> 2u);\n value = ((value & 0x0f0f0f0fu) << 4u) | ((value & 0xf0f0f0f0u) >> 4u);\n value = ((value & 0x00ff00ffu) << 8u) | ((value & 0xff00ff00u) >> 8u);\n return f32(value) * 2.3283064365386963e-10;\n}\n\nfn sample_dimension_1d(\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n dimension: u32\n) -> f32 {\n return random01(mix_seed(pixelId, sampleId, bounce, sample_frame_index(frameIndex), dimension));\n}\n\nfn sample_dimension_2d(\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n dimension: u32,\n strataCount: u32\n) -> vec2<f32> {\n let strata = max(strataCount, 1u);\n let jitter = sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, dimension);\n let scramble = hash_u32(mix_seed(pixelId, sampleId, bounce, sample_frame_index(frameIndex), dimension));\n let stratified = fract((f32(sampleId % strata) + jitter) / f32(strata));\n let lowDiscrepancy = fract(radical_inverse_vdc(sampleId ^ scramble) + jitter);\n return vec2<f32>(stratified, lowDiscrepancy);\n}\n\nfn safe_normalize(value: vec3<f32>, fallback: vec3<f32>) -> vec3<f32> {\n let len = length(value);\n if (len <= 0.000001) {\n return fallback;\n }\n return value / len;\n}\n\nstruct TangentBasis {\n tangent: vec3<f32>,\n bitangent: vec3<f32>,\n};\n\nstruct SurfaceMaterialSample {\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n shadingNormal: vec3<f32>,\n occlusion: f32,\n};\n`;\n","export const WAVEFRONT_SHADER_LIGHTING_WGSL = `\nfn environment_map_uv(direction: vec3<f32>) -> vec2<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let rotationTurns = config.environmentMapSettings.z / 6.28318530718;\n let u = fract(atan2(rayDirection.z, rayDirection.x) / 6.28318530718 + 0.5 + rotationTurns);\n let v = acos(clamp(rayDirection.y, -1.0, 1.0)) / 3.14159265359;\n return vec2<f32>(u, clamp(v, 0.0, 1.0));\n}\n\nfn environment_map_radiance(direction: vec3<f32>) -> vec3<f32> {\n let uv = environment_map_uv(direction);\n let texel = max(textureSampleLevel(environmentMapTexture, environmentMapSampler, uv, 0.0).rgb, vec3<f32>(0.0));\n return texel * max(config.environmentMapSettings.y, 0.0);\n}\n\nfn procedural_sky_radiance(direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let upFactor = saturate(rayDirection.y * 0.5 + 0.5);\n return (\n config.environmentHorizonColor.xyz * (1.0 - upFactor) +\n config.environmentZenithColor.xyz * upFactor\n ) * max(config.environmentSunDirectionIntensity.w, 0.0001);\n}\n\nfn procedural_environment_radiance(direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let sunDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let sunGlow = pow(saturate(dot(rayDirection, sunDirection)), 192.0);\n return (\n procedural_sky_radiance(rayDirection) +\n config.environmentSunColor.xyz * sunGlow * max(config.environmentSunDirectionIntensity.w, 0.0001)\n );\n}\n\nfn base_environment_radiance(direction: vec3<f32>) -> vec3<f32> {\n if (environment_map_enabled()) {\n return environment_map_radiance(direction);\n }\n return procedural_environment_radiance(direction);\n}\n\nfn environment_portal_radiance_scale(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return vec3<f32>(1.0);\n }\n var scale = vec3<f32>(0.0);\n for (var portalIndex = 0u; portalIndex < config.environmentPortalCount; portalIndex = portalIndex + 1u) {\n let portal = environmentPortals[portalIndex];\n if (portal.kind == 1u) {\n let portalNormal = safe_normalize(portal.normal.xyz, vec3<f32>(0.0, 0.0, 1.0));\n let denominator = dot(direction, portalNormal);\n let twoSided = (portal.flags & 1u) != 0u;\n var facing = abs(denominator) > 0.0001;\n if (!twoSided && denominator <= 0.0001) {\n facing = false;\n }\n if (facing) {\n let distance = dot(portal.position.xyz - origin, portalNormal) / denominator;\n if (distance > 0.001) {\n let hitPosition = origin + direction * distance;\n let local = hitPosition - portal.position.xyz;\n let tangent = safe_normalize(portal.tangent.xyz, vec3<f32>(1.0, 0.0, 0.0));\n let bitangent = safe_normalize(portal.bitangent.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let u = dot(local, tangent);\n let v = dot(local, bitangent);\n if (abs(u) <= portal.tangent.w && abs(v) <= portal.bitangent.w) {\n let areaWeight = clamp(sqrt(max(portal.position.w, 0.0001)), 0.25, 4.0);\n let angleWeight = max(abs(denominator), 0.08);\n let portalScale = portal.color.rgb * portal.normal.w * portal.color.a * areaWeight * angleWeight;\n scale = max(scale, portalScale);\n }\n }\n }\n }\n }\n return scale;\n}\n\nfn environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let portalScale = environment_portal_radiance_scale(origin, rayDirection);\n let portalHit = max_component(portalScale) > 0.0001;\n return base_environment_radiance(rayDirection) *\n select(vec3<f32>(1.0), portalScale, portalHit);\n}\n\nfn direct_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let portalScale = environment_portal_radiance_scale(origin, rayDirection);\n let portalHit = max_component(portalScale) > 0.0001;\n if (\n config.environmentPortalCount > 0u &&\n config.environmentPortalMode == 2u &&\n !portalHit\n ) {\n return vec3<f32>(0.0);\n }\n return base_environment_radiance(rayDirection) *\n select(vec3<f32>(1.0), portalScale, portalHit);\n}\n\nfn hammersley_2d(index: u32, count: u32) -> vec2<f32> {\n return vec2<f32>(f32(index) / max(f32(count), 1.0), radical_inverse_vdc(index));\n}\n\nfn build_basis_tangent(normal: vec3<f32>) -> vec3<f32> {\n let tangentFallback = select(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(1.0, 0.0, 0.0), abs(normal.y) >= 0.999);\n return safe_normalize(cross(tangentFallback, normal), vec3<f32>(1.0, 0.0, 0.0));\n}\n\nfn local_to_world(local: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n let tangent = build_basis_tangent(normal);\n let bitangent = safe_normalize(cross(normal, tangent), vec3<f32>(0.0, 0.0, 1.0));\n return safe_normalize(tangent * local.x + bitangent * local.y + normal * local.z, normal);\n}\n\nfn cosine_sample_hemisphere(sample: vec2<f32>, normal: vec3<f32>) -> vec3<f32> {\n let phi = 6.28318530718 * sample.x;\n let radius = sqrt(sample.y);\n let x = cos(phi) * radius;\n let y = sin(phi) * radius;\n let z = sqrt(max(0.0, 1.0 - sample.y));\n return local_to_world(vec3<f32>(x, y, z), normal);\n}\n\nfn importance_sample_ggx(sample: vec2<f32>, roughness: f32, normal: vec3<f32>) -> vec3<f32> {\n let alpha = max(roughness * roughness, 0.0001);\n let phi = 6.28318530718 * sample.x;\n let cosTheta = sqrt((1.0 - sample.y) / max(1.0 + (alpha * alpha - 1.0) * sample.y, 0.0001));\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let localHalf = vec3<f32>(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);\n return local_to_world(localHalf, normal);\n}\n\nfn distribution_ggx(normal: vec3<f32>, halfVector: vec3<f32>, roughness: f32) -> f32 {\n let alpha = max(roughness * roughness, 0.0001);\n let alpha2 = alpha * alpha;\n let nDotH = saturate(dot(normal, halfVector));\n let denominator = nDotH * nDotH * (alpha2 - 1.0) + 1.0;\n return alpha2 / max(3.14159265359 * denominator * denominator, 0.000001);\n}\n\nfn geometry_schlick_ggx(nDotValue: f32, roughness: f32) -> f32 {\n let k = ((roughness + 1.0) * (roughness + 1.0)) / 8.0;\n return nDotValue / max(nDotValue * (1.0 - k) + k, 0.000001);\n}\n\nfn geometry_smith(normal: vec3<f32>, viewDirection: vec3<f32>, lightDirection: vec3<f32>, roughness: f32) -> f32 {\n let nDotV = saturate(dot(normal, viewDirection));\n let nDotL = saturate(dot(normal, lightDirection));\n return geometry_schlick_ggx(nDotV, roughness) * geometry_schlick_ggx(nDotL, roughness);\n}\n\nfn fresnel_schlick(cosine: f32, f0: vec3<f32>) -> vec3<f32> {\n return f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - cosine, 5.0);\n}\n\nfn sample_brdf_lut(nDotV: f32, roughness: f32) -> vec2<f32> {\n let uv = vec2<f32>(clamp(nDotV, 0.0, 1.0), clamp(roughness, 0.0, 1.0));\n return textureSampleLevel(brdfLutTexture, brdfLutSampler, uv, 0.0).xy;\n}\n\nfn prefiltered_environment_radiance(direction: vec3<f32>, roughness: f32) -> vec3<f32> {\n let uv = environment_map_uv(direction);\n let maxLevel = max(config.environmentMapMeta.z - 1.0, 0.0);\n let lod = clamp(roughness, 0.0, 1.0) * maxLevel;\n let texel = max(textureSampleLevel(environmentMapTexture, environmentMapSampler, uv, lod).rgb, vec3<f32>(0.0));\n return texel * max(config.environmentMapSettings.y, 0.0);\n}\n\nfn environment_pdf_dimensions() -> vec2<u32> {\n return vec2<u32>(\n max(u32(config.environmentMapMeta.x), 1u),\n max(u32(config.environmentMapMeta.y), 1u)\n );\n}\n\nfn environment_importance_sampling_enabled() -> bool {\n return config.environmentMapMeta.w > 0.5;\n}\n\nfn uniform_sphere_pdf() -> f32 {\n return 1.0 / (4.0 * 3.14159265359);\n}\n\nfn uniform_hemisphere_pdf() -> f32 {\n return 1.0 / (2.0 * 3.14159265359);\n}\n\nfn cosine_hemisphere_pdf(normal: vec3<f32>, direction: vec3<f32>) -> f32 {\n return saturate(dot(normal, direction)) / 3.14159265359;\n}\n\nfn sample_uniform_sphere_direction(sample: vec2<f32>) -> vec3<f32> {\n let z = 1.0 - 2.0 * sample.y;\n let radial = sqrt(max(1.0 - z * z, 0.0));\n let phi = sample.x * 6.28318530718;\n return vec3<f32>(cos(phi) * radial, z, sin(phi) * radial);\n}\n\nfn sample_uniform_hemisphere_direction(sample: vec2<f32>, normal: vec3<f32>) -> vec3<f32> {\n let z = sample.y;\n let radial = sqrt(max(1.0 - z * z, 0.0));\n let phi = sample.x * 6.28318530718;\n return local_to_world(vec3<f32>(cos(phi) * radial, sin(phi) * radial, z), normal);\n}\n\nfn environment_sampling_texel(x: u32, y: u32) -> vec4<f32> {\n return textureLoad(environmentSamplingTexture, vec2<i32>(i32(x), i32(y)), 0);\n}\n\nfn environment_pdf_texel(x: u32, y: u32) -> f32 {\n return environment_sampling_texel(x, y).x;\n}\n\nfn environment_row_cdf_texel(y: u32) -> f32 {\n return environment_sampling_texel(0u, y).z;\n}\n\nfn environment_column_cdf_texel(x: u32, y: u32) -> f32 {\n return environment_sampling_texel(x, y).y;\n}\n\nfn environment_direction_pdf(direction: vec3<f32>) -> f32 {\n if (!environment_importance_sampling_enabled()) {\n return uniform_sphere_pdf();\n }\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let uv = environment_map_uv(rayDirection);\n let dimensions = environment_pdf_dimensions();\n let width = max(f32(dimensions.x), 1.0);\n let height = max(f32(dimensions.y), 1.0);\n let x = min(u32(uv.x * width), dimensions.x - 1u);\n let y = min(u32(uv.y * height), dimensions.y - 1u);\n let discretePdf = max(environment_pdf_texel(x, y), 0.0);\n let sinTheta = sqrt(max(1.0 - rayDirection.y * rayDirection.y, 0.0));\n let solidAngle = max((2.0 * 3.14159265359 * 3.14159265359 * sinTheta) / (width * height), 0.000001);\n return discretePdf / solidAngle;\n}\n\nfn sample_row_cdf(count: u32, sampleValue: f32) -> u32 {\n if (count == 0u) {\n return 0u;\n }\n var low = 0u;\n var high = count - 1u;\n loop {\n if (low >= high) {\n break;\n }\n let mid = (low + high) / 2u;\n let cdfValue = environment_row_cdf_texel(mid);\n if (sampleValue <= cdfValue) {\n high = mid;\n } else {\n low = mid + 1u;\n }\n }\n return min(low, count - 1u);\n}\n\nfn sample_column_cdf(row: u32, count: u32, sampleValue: f32) -> u32 {\n if (count == 0u) {\n return 0u;\n }\n var low = 0u;\n var high = count - 1u;\n loop {\n if (low >= high) {\n break;\n }\n let mid = (low + high) / 2u;\n let cdfValue = environment_column_cdf_texel(mid, row);\n if (sampleValue <= cdfValue) {\n high = mid;\n } else {\n low = mid + 1u;\n }\n }\n return min(low, count - 1u);\n}\n\nstruct EnvironmentSample {\n direction: vec3<f32>,\n radiance: vec3<f32>,\n pdf: f32,\n};\n\nstruct DirectLightSample {\n direction: vec4<f32>,\n radiance: vec4<f32>,\n pdf: f32,\n maxDistance: f32,\n flags: u32,\n valid: u32,\n};\n\nfn sample_environment_importance(sample: vec2<f32>) -> EnvironmentSample {\n if (!environment_importance_sampling_enabled()) {\n let direction = sample_uniform_sphere_direction(sample);\n return EnvironmentSample(direction, base_environment_radiance(direction), uniform_sphere_pdf());\n }\n let dimensions = environment_pdf_dimensions();\n let row = sample_row_cdf(dimensions.y, sample.y);\n let column = sample_column_cdf(row, dimensions.x, sample.x);\n let uv = vec2<f32>(\n (f32(column) + 0.5) / max(f32(dimensions.x), 1.0),\n (f32(row) + 0.5) / max(f32(dimensions.y), 1.0)\n );\n let theta = uv.y * 3.14159265359;\n let phi = (uv.x - 0.5 - config.environmentMapSettings.z / 6.28318530718) * 6.28318530718;\n let sinTheta = sin(theta);\n let direction = vec3<f32>(cos(phi) * sinTheta, cos(theta), sin(phi) * sinTheta);\n let pdf = environment_direction_pdf(direction);\n return EnvironmentSample(direction, base_environment_radiance(direction), pdf);\n}\n\nfn triangle_surface_normal(triangle: TriangleRecord) -> vec3<f32> {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n return safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n}\n\nfn triangle_surface_area(triangle: TriangleRecord) -> f32 {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n return max(length(cross(edge1, edge2)) * 0.5, 0.000001);\n}\n\nfn solid_angle_pdf_from_area_pdf(\n areaPdf: f32,\n shadingPoint: vec3<f32>,\n lightPoint: vec3<f32>,\n lightNormal: vec3<f32>\n) -> f32 {\n let offset = lightPoint - shadingPoint;\n let distanceSquared = max(dot(offset, offset), 0.000001);\n let lightDirection = safe_normalize(offset, lightNormal);\n let geometry = max(dot(lightNormal, -lightDirection), 0.0);\n if (geometry <= 0.000001) {\n return 0.0;\n }\n return areaPdf * distanceSquared / max(geometry, 0.000001);\n}\n\nfn power_heuristic(pdfA: f32, pdfB: f32) -> f32 {\n let a2 = pdfA * pdfA;\n let b2 = pdfB * pdfB;\n return a2 / max(a2 + b2, 0.000001);\n}\n\nfn visible_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let visible = !scene_visibility_blocked(origin, rayDirection, 1000000.0);\n return select(vec3<f32>(0.0), direct_environment_radiance(origin, rayDirection), visible);\n}\n\nfn glossy_environment_direction(\n incidentDirection: vec3<f32>,\n normal: vec3<f32>,\n roughness: f32,\n normalBlendScale: f32\n) -> vec3<f32> {\n let reflectionDirection = reflect(incidentDirection, normal);\n let blend = clamp(roughness * roughness * normalBlendScale, 0.0, 0.92);\n return safe_normalize(mix(reflectionDirection, normal, blend), normal);\n}\n\nfn surface_glossiness(hit: HitRecord) -> f32 {\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let sheen = clamp(max_component(hit.materialResponse.xyz), 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let baseGloss =\n max(\n clearcoat,\n max(sheen * 0.72, max(specularWeight * (0.38 + metallic * 0.62), transmission))\n );\n return clamp(baseGloss * (1.0 - roughness * 0.72) + metallic * (1.0 - roughness) * 0.35, 0.0, 1.0);\n}\n\nfn surface_specular_f0(hit: HitRecord, surfaceColor: vec3<f32>) -> vec3<f32> {\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let specularColor = clamp(hit.specularColor.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let dielectricF0 = vec3<f32>(0.04) * specularWeight * specularColor;\n return mix(dielectricF0, surfaceColor, metallic);\n}\n\nfn surface_bsdf_sampling_weights(hit: HitRecord) -> vec3<f32> {\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let diffuseWeight = clamp(\n (1.0 - metallic) * max(1.0 - specularWeight * 0.5 - clearcoat * 0.25, 0.15),\n 0.0,\n 1.0\n );\n let specWeight = clamp(max(metallic, specularWeight * 0.75) * (1.0 - clearcoat * 0.5), 0.0, 1.0);\n let clearcoatWeight = clamp(clearcoat, 0.0, 1.0);\n let totalWeight = max(diffuseWeight + specWeight + clearcoatWeight, 0.000001);\n return vec3<f32>(\n diffuseWeight / totalWeight,\n specWeight / totalWeight,\n clearcoatWeight / totalWeight\n );\n}\n\nfn evaluate_surface_bsdf(hit: HitRecord, viewDirection: vec3<f32>, lightDirection: vec3<f32>) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let surfaceColor = clamp(max(hit.color.xyz, config.ambientColor.xyz * 0.35), vec3<f32>(0.0), vec3<f32>(1.0));\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let clearcoatRoughness = clamp(hit.materialExtension.x, 0.0, 1.0);\n let occlusion = clamp(hit.occlusion, 0.0, 1.0);\n let nDotV = saturate(dot(normal, viewDirection));\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotV <= 0.0 || nDotL <= 0.0) {\n return vec3<f32>(0.0);\n }\n let halfVector = safe_normalize(viewDirection + lightDirection, normal);\n let vDotH = saturate(dot(viewDirection, halfVector));\n let f0 = surface_specular_f0(hit, surfaceColor);\n let fresnel = fresnel_schlick(vDotH, f0);\n let distribution = distribution_ggx(normal, halfVector, roughness);\n let geometry = geometry_smith(normal, viewDirection, lightDirection, roughness);\n let specular = (distribution * geometry * fresnel) / max(4.0 * nDotV * nDotL, 0.000001);\n let diffuseWeight = (1.0 - metallic) * (1.0 - clearcoat * 0.24) * (1.0 - clamp(max_component(fresnel), 0.0, 0.98));\n let diffuse = surfaceColor * diffuseWeight / 3.14159265359;\n let clearcoatHalf = safe_normalize(viewDirection + lightDirection, normal);\n let clearcoatDistribution = distribution_ggx(normal, clearcoatHalf, max(clearcoatRoughness, 0.02));\n let clearcoatGeometry = geometry_smith(normal, viewDirection, lightDirection, max(clearcoatRoughness, 0.02));\n let clearcoatFresnel = fresnel_schlick(saturate(dot(viewDirection, clearcoatHalf)), vec3<f32>(0.04));\n let clearcoatTerm =\n (clearcoatDistribution * clearcoatGeometry * clearcoatFresnel) /\n max(4.0 * nDotV * nDotL, 0.000001) *\n clearcoat;\n return (diffuse + specular + clearcoatTerm) * mix(0.42, 1.0, occlusion);\n}\n\nfn diffuse_pdf(normal: vec3<f32>, lightDirection: vec3<f32>) -> f32 {\n return saturate(dot(normal, lightDirection)) / 3.14159265359;\n}\n\nfn ggx_pdf(normal: vec3<f32>, viewDirection: vec3<f32>, lightDirection: vec3<f32>, roughness: f32) -> f32 {\n let halfVector = safe_normalize(viewDirection + lightDirection, normal);\n let nDotH = saturate(dot(normal, halfVector));\n let vDotH = saturate(dot(viewDirection, halfVector));\n let distribution = distribution_ggx(normal, halfVector, roughness);\n return (distribution * nDotH) / max(4.0 * vDotH, 0.000001);\n}\n\nfn evaluate_surface_bsdf_pdf(hit: HitRecord, viewDirection: vec3<f32>, lightDirection: vec3<f32>) -> f32 {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let weights = surface_bsdf_sampling_weights(hit);\n let diffuseTerm = diffuse_pdf(normal, lightDirection);\n let specTerm = ggx_pdf(normal, viewDirection, lightDirection, max(roughness, 0.02));\n let clearcoatTerm = ggx_pdf(normal, viewDirection, lightDirection, max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02));\n return weights.x * diffuseTerm + weights.y * specTerm + weights.z * clearcoatTerm;\n}\n\nfn gated_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let portalScale = environment_portal_radiance_scale(origin, safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0)));\n if (\n config.environmentPortalCount > 0u &&\n config.environmentPortalMode == 2u &&\n max_component(portalScale) <= 0.0001\n ) {\n return config.ambientColor.xyz * 0.65;\n }\n return environment_radiance(origin, direction);\n}\n\nfn medium_dimensions() -> vec2<u32> {\n return textureDimensions(mediumTableTexture);\n}\n\nfn medium_valid(mediumRefId: u32) -> bool {\n let dimensions = medium_dimensions();\n return mediumRefId > 0u && mediumRefId < dimensions.x;\n}\n\nfn medium_absorption(mediumRefId: u32) -> vec3<f32> {\n if (!medium_valid(mediumRefId)) {\n return vec3<f32>(0.0);\n }\n return max(\n textureLoad(mediumTableTexture, vec2<i32>(i32(mediumRefId), 0), 0).xyz,\n vec3<f32>(0.0)\n );\n}\n\nfn medium_scattering(mediumRefId: u32) -> vec3<f32> {\n if (!medium_valid(mediumRefId)) {\n return vec3<f32>(0.0);\n }\n return max(\n textureLoad(mediumTableTexture, vec2<i32>(i32(mediumRefId), 1), 0).xyz,\n vec3<f32>(0.0)\n );\n}\n\nfn medium_transmittance(mediumRefId: u32, distance: f32) -> vec3<f32> {\n if (!medium_valid(mediumRefId) || distance <= 0.000001) {\n return vec3<f32>(1.0);\n }\n let extinction = medium_absorption(mediumRefId) + medium_scattering(mediumRefId);\n return vec3<f32>(\n exp(-extinction.x * distance),\n exp(-extinction.y * distance),\n exp(-extinction.z * distance)\n );\n}\n\nconst MAX_MEDIUM_STACK_DEPTH: u32 = 4u;\n\nfn medium_stack_current_id(ray: RayRecord) -> u32 {\n if (ray.mediumStackDepth == 0u) {\n return ray.mediumRefId;\n }\n if (ray.mediumStackDepth == 1u) {\n return ray.mediumStack.x;\n }\n if (ray.mediumStackDepth == 2u) {\n return ray.mediumStack.y;\n }\n if (ray.mediumStackDepth == 3u) {\n return ray.mediumStack.z;\n }\n return ray.mediumStack.w;\n}\n\nfn transitioned_medium_stack(ray: RayRecord, hit: HitRecord) -> vec4<u32> {\n var stack = ray.mediumStack;\n var depth = min(ray.mediumStackDepth, MAX_MEDIUM_STACK_DEPTH);\n let mediumId = hit.mediumRefId;\n if (!medium_valid(mediumId)) {\n return stack;\n }\n if (hit.frontFace == 1u) {\n if (depth == 0u) {\n stack.x = mediumId;\n } else if (depth == 1u) {\n stack.y = mediumId;\n } else if (depth == 2u) {\n stack.z = mediumId;\n } else if (depth == 3u) {\n stack.w = mediumId;\n } else {\n stack = vec4<u32>(stack.y, stack.z, stack.w, mediumId);\n }\n return stack;\n }\n if (depth == 4u && stack.w == mediumId) {\n return vec4<u32>(stack.x, stack.y, stack.z, 0u);\n }\n if (depth >= 3u && stack.z == mediumId) {\n return vec4<u32>(stack.x, stack.y, stack.w, 0u);\n }\n if (depth >= 2u && stack.y == mediumId) {\n return vec4<u32>(stack.x, stack.z, stack.w, 0u);\n }\n if (depth >= 1u && stack.x == mediumId) {\n return vec4<u32>(stack.y, stack.z, stack.w, 0u);\n }\n return stack;\n}\n\nfn transitioned_medium_stack_depth(ray: RayRecord, hit: HitRecord) -> u32 {\n let stack = transitioned_medium_stack(ray, hit);\n if (stack.w != 0u) {\n return 4u;\n }\n if (stack.z != 0u) {\n return 3u;\n }\n if (stack.y != 0u) {\n return 2u;\n }\n if (stack.x != 0u) {\n return 1u;\n }\n return 0u;\n}\n\nfn transmitted_medium_ref_id(ray: RayRecord, hit: HitRecord) -> u32 {\n if (!medium_valid(hit.mediumRefId)) {\n return medium_stack_current_id(ray);\n }\n let stack = transitioned_medium_stack(ray, hit);\n if (stack.w != 0u) {\n return stack.w;\n }\n if (stack.z != 0u) {\n return stack.z;\n }\n if (stack.y != 0u) {\n return stack.y;\n }\n if (stack.x != 0u) {\n return stack.x;\n }\n return 0u;\n}\n\nfn surface_delta_reflection_throughput(hit: HitRecord, viewDirection: vec3<f32>) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let surfaceColor = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let fresnel = fresnel_schlick(saturate(dot(normal, viewDirection)), surface_specular_f0(hit, surfaceColor));\n return sanitize_path_throughput(fresnel);\n}\n\nfn surface_delta_transmission_throughput(hit: HitRecord, viewDirection: vec3<f32>) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let surfaceColor = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let fresnel = fresnel_schlick(saturate(dot(normal, viewDirection)), surface_specular_f0(hit, surfaceColor));\n let transmissionTint = mix(vec3<f32>(1.0), surfaceColor, transmission);\n return sanitize_path_throughput(max(vec3<f32>(1.0) - fresnel, vec3<f32>(0.0)) * transmissionTint);\n}\n\nfn surface_continuation_throughput(\n hit: HitRecord,\n viewDirection: vec3<f32>,\n lightDirection: vec3<f32>,\n scatter: ScatterResult\n) -> vec3<f32> {\n if ((scatter.flags & RAY_FLAG_DELTA_SAMPLE) != 0u) {\n if (scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION) {\n return surface_delta_transmission_throughput(hit, viewDirection);\n }\n return surface_delta_reflection_throughput(hit, viewDirection);\n }\n if (scatter.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let normal = surface_shading_normal(hit);\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n let nDotL = saturate(dot(normal, lightDirection));\n return sanitize_path_throughput(bsdf * (nDotL / scatter.pdf));\n}\n\nfn sunlit_baseline_radiance(normal: vec3<f32>) -> vec3<f32> {\n let baseline = max(config.pathResolveSettings.y, 0.0);\n if (baseline <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let sunDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let sunFacing = saturate(dot(normal, sunDirection));\n let skyFacing = 0.35 + saturate(normal.y * 0.5 + 0.5) * 0.65;\n let directionalWeight = 0.38 + sunFacing * 0.62;\n let sunTint = max(config.environmentSunColor.xyz, vec3<f32>(0.0));\n return sanitize_linear_radiance(sunTint * baseline * skyFacing * directionalWeight * 0.04);\n}\n\nfn terminal_surface_environment_source(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, normal);\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let glossiness = surface_glossiness(hit);\n let normalEnvironment = gated_environment_radiance(origin, normal);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let reflectionDirection = glossy_environment_direction(\n ray.direction.xyz,\n normal,\n roughness,\n mix(0.88, 0.38, glossiness)\n );\n let reflectionEnvironment = prefiltered_environment_radiance(reflectionDirection, roughness);\n let surfaceColor = clamp(max(hit.color.xyz, config.ambientColor.xyz * 0.35), vec3<f32>(0.0), vec3<f32>(1.0));\n let f0 = surface_specular_f0(hit, surfaceColor);\n let brdfTerm = sample_brdf_lut(saturate(dot(normal, viewDirection)), roughness);\n let specularEnvironment = reflectionEnvironment * (f0 * brdfTerm.x + vec3<f32>(brdfTerm.y));\n let sunlitFloor = sunlit_baseline_radiance(normal);\n let ambientFloor = select(\n max(config.ambientColor.xyz, sunlitFloor * 0.82),\n max(config.ambientColor.xyz * 0.35, sunlitFloor * 0.58),\n environment_map_enabled()\n );\n let environmentInfluence = select(\n max(0.12, config.pathResolveSettings.y * 0.42),\n max(config.environmentMapSettings.w, max(0.12, config.pathResolveSettings.y * 0.42)),\n environment_map_enabled()\n );\n let glossyEnvironment = max(\n normalEnvironment,\n max(reflectionEnvironment * mix(0.24, 0.92, glossiness), specularEnvironment)\n );\n let environmentFloor = max(ambientFloor, max(sunlitFloor, glossyEnvironment * environmentInfluence));\n let materialFloor = select(0.7, 1.0, hit.materialKind == 0u || hit.materialKind == 3u);\n return sanitize_linear_radiance(environmentFloor * materialFloor);\n}\n\nfn terminal_surface_environment_contribution(\n ray: RayRecord,\n throughput: vec3<f32>,\n hit: HitRecord\n) -> vec3<f32> {\n let surfaceColor = max(hit.color.xyz, config.ambientColor.xyz);\n let occlusion = mix(0.75, 1.0, clamp(hit.occlusion, 0.0, 1.0));\n return sanitize_linear_radiance(\n throughput *\n surfaceColor *\n terminal_surface_environment_source(ray, hit) *\n occlusion\n );\n}\n\nfn direct_environment_portal_irradiance(origin: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return vec3<f32>(0.0);\n }\n\n var irradiance = vec3<f32>(0.0);\n for (var portalIndex = 0u; portalIndex < config.environmentPortalCount; portalIndex = portalIndex + 1u) {\n let portal = environmentPortals[portalIndex];\n if (portal.kind != 1u) {\n continue;\n }\n\n let toPortal = portal.position.xyz - origin;\n let distanceSquared = max(dot(toPortal, toPortal), 0.01);\n let direction = safe_normalize(toPortal, normal);\n let surfaceFacing = saturate(dot(normal, direction));\n if (surfaceFacing <= 0.0001) {\n continue;\n }\n\n let portalNormal = safe_normalize(portal.normal.xyz, vec3<f32>(0.0, 0.0, 1.0));\n let twoSided = (portal.flags & 1u) != 0u;\n let portalFacing = select(\n saturate(dot(-direction, portalNormal)),\n max(abs(dot(direction, portalNormal)), 0.15),\n twoSided\n );\n let area = max(portal.position.w, 0.0001);\n let distanceFalloff = clamp(area / max(distanceSquared, area * 0.25), 0.0, 2.5);\n let traceDistance = max(sqrt(distanceSquared) - 0.01, 0.01);\n if (scene_visibility_blocked(origin, direction, traceDistance)) {\n continue;\n }\n irradiance = irradiance +\n portal.color.rgb *\n portal.normal.w *\n portal.color.a *\n surfaceFacing *\n portalFacing *\n distanceFalloff;\n }\n return irradiance;\n}\n\nfn visibility_test_ray(origin: vec3<f32>, direction: vec3<f32>) -> RayRecord {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n return RayRecord(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(origin, 1.0),\n vec4<f32>(rayDirection, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<u32>(0u)\n );\n}\n\nfn scene_visibility_blocked(origin: vec3<f32>, direction: vec3<f32>, maxDistance: f32) -> bool {\n let testRay = visibility_test_ray(origin, direction);\n let nearest = max(maxDistance, 0.001);\n\n for (var objectIndex = 0u; objectIndex < config.sceneObjectCount; objectIndex = objectIndex + 1u) {\n let object = sceneObjects[objectIndex];\n var current = no_candidate();\n if (object.kind == 1u) {\n current = intersect_sphere(testRay, object);\n } else if (object.kind == 2u) {\n current = intersect_box(testRay, object);\n }\n if (current.hit == 1u && current.distance < nearest) {\n return true;\n }\n }\n\n let meshCandidate = intersect_bvh(testRay, nearest);\n return meshCandidate.hit == 1u && meshCandidate.distance < nearest;\n}\n\nfn sample_emissive_triangle_light(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n selectionDimension: u32,\n surfaceDimension: u32\n) -> DirectLightSample {\n if (config.emissiveTriangleCount == 0u) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n let selector =\n sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, selectionDimension);\n var lightSlot = min(\n u32(selector * f32(config.emissiveTriangleCount)),\n config.emissiveTriangleCount - 1u\n );\n if (strict_physical_low_spp_lighting_enabled()) {\n let firstMetadata = bvhNodes[config.bvhNodeCapacity];\n let totalWeight = max(firstMetadata.boundsMin.z, 0.0);\n if (totalWeight > 0.000001) {\n let targetWeight = selector * totalWeight;\n for (var candidateSlot = 0u; candidateSlot < config.emissiveTriangleCount; candidateSlot = candidateSlot + 1u) {\n let candidateMetadata = bvhNodes[config.bvhNodeCapacity + candidateSlot];\n if (targetWeight <= candidateMetadata.boundsMin.x) {\n lightSlot = candidateSlot;\n break;\n }\n }\n }\n }\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let triangleIndex = lightMetadata.childOrFirst;\n if (triangleIndex >= config.triangleCount) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n\n let lightTriangle = triangles[triangleIndex];\n let triangleArea = triangle_surface_area(lightTriangle);\n let lightNormal = triangle_surface_normal(lightTriangle);\n let sampleUv = sample_dimension_2d(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n surfaceDimension,\n config.samplesPerPixel\n );\n let root = sqrt(sampleUv.x);\n let b0 = 1.0 - root;\n let b1 = root * (1.0 - sampleUv.y);\n let b2 = root * sampleUv.y;\n let lightPoint =\n lightTriangle.v0.xyz * b0 +\n lightTriangle.v1.xyz * b1 +\n lightTriangle.v2.xyz * b2;\n let lightDirection = safe_normalize(lightPoint - hit.position.xyz, lightNormal);\n let traceDistance = max(distance(lightPoint, hit.position.xyz) - 0.01, 0.01);\n var selectionProbability = 1.0 / max(f32(config.emissiveTriangleCount), 1.0);\n if (strict_physical_low_spp_lighting_enabled()) {\n let totalWeight = max(lightMetadata.boundsMin.z, 0.0);\n let triangleWeight = max(lightMetadata.boundsMin.y, 0.0);\n if (totalWeight > 0.000001 && triangleWeight > 0.000001) {\n selectionProbability = triangleWeight / totalWeight;\n }\n }\n let areaPdf = selectionProbability / max(triangleArea, 0.000001);\n let lightPdf = solid_angle_pdf_from_area_pdf(areaPdf, hit.position.xyz, lightPoint, lightNormal);\n if (lightPdf <= 0.000001) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n let radiance = max(lightTriangle.emission.xyz, lightTriangle.color.xyz);\n if (max_component(radiance) <= 0.000001) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n return DirectLightSample(vec4<f32>(lightDirection, 0.0), vec4<f32>(radiance, 0.0), lightPdf, traceDistance, 0u, 1u);\n}\n\nfn emissive_direct_class_probability() -> f32 {\n if (config.emissiveTriangleCount == 0u) {\n return 0.0;\n }\n if (\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING) ||\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n ) {\n return 1.0;\n }\n return select(1.0, 0.5, config.emissiveTriangleCount > 0u);\n}\n\nfn terminal_emissive_light_pdf(ray: RayRecord, hit: HitRecord) -> f32 {\n if (config.emissiveTriangleCount == 0u) {\n return 0.0;\n }\n\n var lightSlot = 0xffffffffu;\n var triangleIndex = 0xffffffffu;\n for (var candidateSlot = 0u; candidateSlot < config.emissiveTriangleCount; candidateSlot = candidateSlot + 1u) {\n let candidateMetadata = bvhNodes[config.bvhNodeCapacity + candidateSlot];\n let candidateTriangleIndex = candidateMetadata.childOrFirst;\n if (candidateTriangleIndex >= config.triangleCount) {\n continue;\n }\n let candidateTriangle = triangles[candidateTriangleIndex];\n if (candidateTriangle.triangleId == hit.primitiveId) {\n lightSlot = candidateSlot;\n triangleIndex = candidateTriangleIndex;\n break;\n }\n }\n\n if (lightSlot == 0xffffffffu || triangleIndex == 0xffffffffu) {\n return 0.0;\n }\n\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let lightTriangle = triangles[triangleIndex];\n let triangleArea = triangle_surface_area(lightTriangle);\n let lightNormal = triangle_surface_normal(lightTriangle);\n var selectionProbability =\n emissive_direct_class_probability() /\n max(f32(config.emissiveTriangleCount), 1.0);\n if (strict_physical_low_spp_lighting_enabled()) {\n let totalWeight = max(lightMetadata.boundsMin.z, 0.0);\n let triangleWeight = max(lightMetadata.boundsMin.y, 0.0);\n if (totalWeight > 0.000001 && triangleWeight > 0.000001) {\n selectionProbability = emissive_direct_class_probability() * triangleWeight / totalWeight;\n }\n }\n\n let areaPdf = selectionProbability / max(triangleArea, 0.000001);\n return solid_angle_pdf_from_area_pdf(\n areaPdf,\n ray.origin.xyz,\n hit.position.xyz,\n lightNormal\n );\n}\n\nfn direct_light_sample_frame_index() -> u32 {\n return select(\n config.frameIndex,\n 0u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING) ||\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n );\n}\n\nfn direct_light_sample_pixel_id(ray: RayRecord) -> u32 {\n return select(\n ray.sourcePixelId,\n 0u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n );\n}\n\nfn sample_environment_direct_light(\n hit: HitRecord,\n ray: RayRecord,\n normal: vec3<f32>,\n selector: f32,\n environmentSelectionProbability: f32\n) -> DirectLightSample {\n let environmentUv = sample_dimension_2d(\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_DIRECT_ENVIRONMENT,\n config.samplesPerPixel\n );\n var lightDirection = normal;\n var radiance = vec3<f32>(0.0);\n var pdf = 0.0;\n if (strict_physical_low_spp_lighting_enabled() && !environment_importance_sampling_enabled()) {\n if (transport_experiment_enabled(TRANSPORT_EXPERIMENT_PRODUCT_STUDIO_IMPORTANCE)) {\n lightDirection = cosine_sample_hemisphere(environmentUv, normal);\n radiance = procedural_sky_radiance(lightDirection);\n pdf = cosine_hemisphere_pdf(normal, lightDirection);\n } else {\n lightDirection = sample_uniform_hemisphere_direction(environmentUv, normal);\n radiance = procedural_sky_radiance(lightDirection);\n pdf = uniform_hemisphere_pdf();\n }\n } else {\n let environmentSample = sample_environment_importance(vec2<f32>(\n selector / max(environmentSelectionProbability, 0.000001),\n environmentUv.y\n ));\n lightDirection = safe_normalize(environmentSample.direction, normal);\n radiance = direct_environment_radiance(\n offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection),\n lightDirection\n );\n pdf = environmentSample.pdf;\n }\n return DirectLightSample(\n vec4<f32>(lightDirection, 0.0),\n vec4<f32>(radiance, 0.0),\n pdf * environmentSelectionProbability,\n 1000000.0,\n 0u,\n 1u\n );\n}\n\nfn sample_emissive_direct_light(\n hit: HitRecord,\n ray: RayRecord,\n environmentSelectionProbability: f32\n) -> DirectLightSample {\n let emissiveSample = sample_emissive_triangle_light(\n hit,\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_EMISSIVE_LIGHT_SELECTION,\n SAMPLE_DIM_EMISSIVE_LIGHT_SURFACE\n );\n if (emissiveSample.valid == 0u) {\n return emissiveSample;\n }\n return DirectLightSample(\n emissiveSample.direction,\n emissiveSample.radiance,\n emissiveSample.pdf * (1.0 - environmentSelectionProbability),\n emissiveSample.maxDistance,\n emissiveSample.flags,\n emissiveSample.valid\n );\n}\n\nfn sample_direct_light(hit: HitRecord, ray: RayRecord, normal: vec3<f32>) -> DirectLightSample {\n let environmentSelectionProbability =\n 1.0 - emissive_direct_class_probability();\n let selector = sample_dimension_1d(\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_DIRECT_LIGHT_SELECTOR\n );\n if (selector < environmentSelectionProbability) {\n return sample_environment_direct_light(hit, ray, normal, selector, environmentSelectionProbability);\n }\n return sample_emissive_direct_light(hit, ray, environmentSelectionProbability);\n}\n\nfn direct_light_sample_contribution(ray: RayRecord, hit: HitRecord, lightSample: DirectLightSample) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n if (lightSample.valid == 0u) {\n return vec3<f32>(0.0);\n }\n if (lightSample.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let lightDirection = safe_normalize(lightSample.direction.xyz, normal);\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection);\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotL <= 0.000001) {\n return vec3<f32>(0.0);\n }\n if (scene_visibility_blocked(origin, lightDirection, lightSample.maxDistance)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance = lightSample.radiance.xyz;\n if (max_component(incidentRadiance) <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n if (max_component(bsdf) <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let bsdfPdf = evaluate_surface_bsdf_pdf(hit, viewDirection, lightDirection);\n let misWeight = power_heuristic(lightSample.pdf, bsdfPdf);\n let contribution = select(\n ray.throughput.xyz *\n bsdf *\n incidentRadiance *\n (nDotL * misWeight / max(lightSample.pdf, 0.000001)),\n ray.throughput.xyz * bsdf * incidentRadiance * nDotL,\n (lightSample.flags & DIRECT_LIGHT_FLAG_DELTA) != 0u\n );\n return sanitize_linear_radiance(contribution);\n}\n\nfn surface_direct_light_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n if (transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING)) {\n let environmentLight = sample_environment_direct_light(hit, ray, normal, 0.5, 1.0);\n let emissiveLight = sample_emissive_direct_light(hit, ray, 0.0);\n return sanitize_linear_radiance(\n direct_light_sample_contribution(ray, hit, environmentLight) +\n direct_light_sample_contribution(ray, hit, emissiveLight)\n );\n }\n return direct_light_sample_contribution(ray, hit, sample_direct_light(hit, ray, normal));\n}\n\nfn surface_procedural_sun_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n if (!strict_physical_low_spp_lighting_enabled() || environment_map_enabled()) {\n return vec3<f32>(0.0);\n }\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let lightDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotL <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection);\n if (scene_visibility_blocked(origin, lightDirection, 1000000.0)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance =\n max(config.environmentSunColor.xyz, vec3<f32>(0.0)) *\n max(config.environmentSunDirectionIntensity.w, 0.0001);\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n return sanitize_linear_radiance(ray.throughput.xyz * bsdf * incidentRadiance * nDotL);\n}\n\n`;\n","export const WAVEFRONT_SHADER_MATERIALS_WGSL = `\nfn srgb_to_linear_channel(value: f32) -> f32 {\n if (value <= 0.04045) {\n return value / 12.92;\n }\n return pow((value + 0.055) / 1.055, 2.4);\n}\n\nfn srgb_to_linear_vec3(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n srgb_to_linear_channel(value.x),\n srgb_to_linear_channel(value.y),\n srgb_to_linear_channel(value.z)\n );\n}\n\nfn wrap_uv(uv: vec2<f32>) -> vec2<f32> {\n return fract(fract(uv) + vec2<f32>(1.0));\n}\n\nfn atlas_sample_uv(rect: vec4<f32>, uv: vec2<f32>) -> vec2<f32> {\n let local = wrap_uv(uv);\n let clamped = clamp(local, vec2<f32>(0.001), vec2<f32>(0.999));\n return rect.xy + clamped * rect.zw;\n}\n\nfn sample_atlas(textureRef: texture_2d<f32>, rect: vec4<f32>, uv: vec2<f32>) -> vec4<f32> {\n return textureSampleLevel(textureRef, materialAtlasSampler, atlas_sample_uv(rect, uv), 0.0);\n}\n\nfn build_triangle_tangent_basis(\n triangle: TriangleRecord,\n fallbackNormal: vec3<f32>\n) -> TangentBasis {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n let uv0 = triangle.uv0uv1.xy;\n let uv1 = triangle.uv0uv1.zw;\n let uv2 = triangle.uv2Pad.xy;\n let deltaUv1 = uv1 - uv0;\n let deltaUv2 = uv2 - uv0;\n let determinant = deltaUv1.x * deltaUv2.y - deltaUv1.y * deltaUv2.x;\n if (abs(determinant) <= 0.000001) {\n let tangentFallback = select(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(1.0, 0.0, 0.0), abs(fallbackNormal.y) >= 0.999);\n let tangent = safe_normalize(cross(tangentFallback, fallbackNormal), vec3<f32>(1.0, 0.0, 0.0));\n let bitangent = safe_normalize(cross(fallbackNormal, tangent), vec3<f32>(0.0, 0.0, 1.0));\n return TangentBasis(tangent, bitangent);\n }\n let inverse = 1.0 / determinant;\n let tangent = safe_normalize(\n inverse * (edge1 * deltaUv2.y - edge2 * deltaUv1.y),\n vec3<f32>(1.0, 0.0, 0.0)\n );\n let bitangent = safe_normalize(\n inverse * (-edge1 * deltaUv2.x + edge2 * deltaUv1.x),\n vec3<f32>(0.0, 0.0, 1.0)\n );\n return TangentBasis(tangent, bitangent);\n}\n\nfn sample_surface_material(\n triangle: TriangleRecord,\n uv: vec2<f32>,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>\n) -> SurfaceMaterialSample {\n let baseColorTexel = sample_atlas(baseColorAtlasTexture, triangle.baseColorAtlas, uv);\n let baseColor = vec4<f32>(\n clamp(triangle.color.rgb * srgb_to_linear_vec3(baseColorTexel.rgb), vec3<f32>(0.0), vec3<f32>(1.0)),\n clamp(triangle.color.a * baseColorTexel.a, 0.0, 1.0)\n );\n let metallicRoughnessTexel = sample_atlas(\n metallicRoughnessAtlasTexture,\n triangle.metallicRoughnessAtlas,\n uv\n );\n let normalTexel = sample_atlas(normalAtlasTexture, triangle.normalAtlas, uv);\n let occlusionTexel = sample_atlas(occlusionAtlasTexture, triangle.occlusionAtlas, uv);\n let emissiveTexel = sample_atlas(emissiveAtlasTexture, triangle.emissiveAtlas, uv);\n let clearcoatTexel = sample_atlas(clearcoatAtlasTexture, triangle.clearcoatAtlas, uv);\n let clearcoatRoughnessTexel = sample_atlas(\n clearcoatRoughnessAtlasTexture,\n triangle.clearcoatRoughnessAtlas,\n uv\n );\n let clearcoatNormalTexel = sample_atlas(\n clearcoatNormalAtlasTexture,\n triangle.clearcoatNormalAtlas,\n uv\n );\n let transmissionTexel = sample_atlas(transmissionAtlasTexture, triangle.transmissionAtlas, uv);\n let thicknessTexel = sample_atlas(thicknessAtlasTexture, triangle.thicknessAtlas, uv);\n let sheenColorTexel = sample_atlas(sheenColorAtlasTexture, triangle.sheenColorAtlas, uv);\n let sheenRoughnessTexel = sample_atlas(\n sheenRoughnessAtlasTexture,\n triangle.sheenRoughnessAtlas,\n uv\n );\n let specularTexel = sample_atlas(specularAtlasTexture, triangle.specularAtlas, uv);\n let specularColorTexel = sample_atlas(\n specularColorAtlasTexture,\n triangle.specularColorAtlas,\n uv\n );\n let iridescenceTexel = sample_atlas(iridescenceAtlasTexture, triangle.iridescenceAtlas, uv);\n let iridescenceThicknessTexel = sample_atlas(\n iridescenceThicknessAtlasTexture,\n triangle.iridescenceThicknessAtlas,\n uv\n );\n let anisotropyTexel = sample_atlas(anisotropyAtlasTexture, triangle.anisotropyAtlas, uv);\n let normalScale = clamp(triangle.textureSettings.x, 0.0, 1.0);\n let tangentBasis = build_triangle_tangent_basis(triangle, geometricNormal);\n let tangentNormal = safe_normalize(\n vec3<f32>(\n (normalTexel.x * 2.0 - 1.0) * normalScale,\n (normalTexel.y * 2.0 - 1.0) * normalScale,\n 1.0 + ((normalTexel.z * 2.0 - 1.0) - 1.0) * normalScale\n ),\n vec3<f32>(0.0, 0.0, 1.0)\n );\n let mappedNormal = safe_normalize(\n tangentBasis.tangent * tangentNormal.x +\n tangentBasis.bitangent * tangentNormal.y +\n shadingNormal * tangentNormal.z,\n shadingNormal\n );\n let emission = vec4<f32>(\n max(\n triangle.emission.rgb *\n srgb_to_linear_vec3(emissiveTexel.rgb) *\n max(triangle.textureSettings.z, 0.0),\n vec3<f32>(0.0)\n ),\n clamp(triangle.emission.a * emissiveTexel.a, 0.0, 1.0)\n );\n return SurfaceMaterialSample(\n baseColor,\n emission,\n vec4<f32>(\n clamp(triangle.material.x * metallicRoughnessTexel.y, 0.0, 1.0),\n clamp(triangle.material.y * metallicRoughnessTexel.z, 0.0, 1.0),\n clamp(triangle.material.z * baseColor.a, 0.0, 1.0),\n clamp(triangle.material.w, 1.0, 3.0)\n ),\n vec4<f32>(\n triangle.materialResponse.rgb * sheenColorTexel.rgb,\n triangle.materialResponse.w * clearcoatTexel.r * clearcoatNormalTexel.r\n ),\n vec4<f32>(\n triangle.materialExtension.x * clearcoatRoughnessTexel.r * (0.5 + 0.5 * sheenRoughnessTexel.r),\n triangle.materialExtension.y * specularTexel.r * (0.5 + 0.5 * iridescenceTexel.r),\n triangle.materialExtension.z * transmissionTexel.r,\n triangle.materialExtension.w * thicknessTexel.r * (0.5 + 0.5 * iridescenceThicknessTexel.r)\n ),\n vec4<f32>(\n triangle.specularColor.rgb * specularColorTexel.rgb * (0.5 + 0.5 * anisotropyTexel.r),\n triangle.specularColor.a\n ),\n repair_shading_normal(geometricNormal, mappedNormal),\n clamp(\n mix(1.0, occlusionTexel.x, clamp(triangle.textureSettings.y, 0.0, 1.0)),\n 0.0,\n 1.0\n )\n );\n}\n\nfn saturate(value: f32) -> f32 {\n return clamp(value, 0.0, 1.0);\n}\n\nfn max_component(value: vec3<f32>) -> f32 {\n return max(max(value.x, value.y), value.z);\n}\n\nfn radiance_luminance(value: vec3<f32>) -> f32 {\n return dot(value, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn environment_map_enabled() -> bool {\n return config.environmentMapSettings.x > 0.5;\n}\n\nfn deferred_path_resolve_enabled() -> bool {\n return config.pathResolveSettings.x > 0.5;\n}\n\nfn strict_physical_low_spp_lighting_enabled() -> bool {\n return config.pathResolveSettings.z > 0.5;\n}\n\nfn path_vertex_count_per_ray() -> u32 {\n return config.maxDepth + 1u;\n}\n\nfn path_vertex_index(rayId: u32, depth: u32) -> u32 {\n return rayId * path_vertex_count_per_ray() + min(depth, config.maxDepth);\n}\n\nfn clear_deferred_path(rayId: u32) {\n if (!deferred_path_resolve_enabled()) {\n return;\n }\n\n for (var depth = 0u; depth <= config.maxDepth; depth = depth + 1u) {\n pathVertices[path_vertex_index(rayId, depth)] = vec4<f32>(0.0);\n if (depth == config.maxDepth) {\n break;\n }\n }\n}\n\nfn sanitize_path_throughput_component(value: f32) -> f32 {\n if (value != value || value <= 0.0) {\n return 0.0;\n }\n return min(value, 65504.0);\n}\n\nfn sanitize_path_throughput(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n sanitize_path_throughput_component(value.x),\n sanitize_path_throughput_component(value.y),\n sanitize_path_throughput_component(value.z)\n );\n}\n\nfn record_deferred_path_throughput(ray: RayRecord, throughput: vec3<f32>) {\n if (!deferred_path_resolve_enabled() || ray.rayId >= config.tilePixelCount || ray.bounce >= config.maxDepth) {\n return;\n }\n pathVertices[path_vertex_index(ray.rayId, ray.bounce)] =\n vec4<f32>(sanitize_path_throughput(throughput), 1.0);\n}\n\nfn record_deferred_terminal_source(ray: RayRecord, sourceRadiance: vec3<f32>, sourceKind: u32) {\n if (!deferred_path_resolve_enabled() || ray.rayId >= config.tilePixelCount) {\n return;\n }\n pathVertices[path_vertex_index(ray.rayId, config.maxDepth)] =\n vec4<f32>(sanitize_linear_radiance(sourceRadiance), f32(sourceKind));\n}\n`;\n","export const PRESENT_WGSL = `\nstruct VertexOut {\n @builtin(position) position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n};\n\n@vertex\nfn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOut {\n var positions = array<vec2<f32>, 3>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(3.0, -1.0),\n vec2<f32>(-1.0, 3.0)\n );\n var uvs = array<vec2<f32>, 3>(\n vec2<f32>(0.0, 1.0),\n vec2<f32>(2.0, 1.0),\n vec2<f32>(0.0, -1.0)\n );\n var out: VertexOut;\n out.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);\n out.uv = uvs[vertexIndex];\n return out;\n}\n\n@group(0) @binding(0) var renderTexture: texture_2d<f32>;\n@group(0) @binding(1) var renderSampler: sampler;\n\n@fragment\nfn fragmentMain(in: VertexOut) -> @location(0) vec4<f32> {\n return textureSample(renderTexture, renderSampler, in.uv);\n}\n`;\n","import { WAVEFRONT_COMPUTE_WORKGROUP_SIZE } from \"./wavefront-workgroup.js\";\nimport { WAVEFRONT_SHADER_BVH_WGSL } from \"./wavefront-shader-bvh.js\";\nimport { WAVEFRONT_SHADER_KERNELS_WGSL } from \"./wavefront-shader-kernels.js\";\nimport { WAVEFRONT_SHADER_LAYOUT_WGSL } from \"./wavefront-shader-layout.js\";\nimport { WAVEFRONT_SHADER_LIGHTING_WGSL } from \"./wavefront-shader-lighting.js\";\nimport { WAVEFRONT_SHADER_MATERIALS_WGSL } from \"./wavefront-shader-materials.js\";\nexport { PRESENT_WGSL } from \"./wavefront-present-shader.js\";\n\nfunction readPositiveInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return numeric;\n}\n\nexport const WAVEFRONT_COMPUTE_WGSL = [\n WAVEFRONT_SHADER_LAYOUT_WGSL,\n WAVEFRONT_SHADER_MATERIALS_WGSL,\n WAVEFRONT_SHADER_LIGHTING_WGSL,\n WAVEFRONT_SHADER_BVH_WGSL,\n WAVEFRONT_SHADER_KERNELS_WGSL,\n].join(\"\\n\");\n\nexport function createWavefrontPathTracingComputeShaderSource(options = {}) {\n const workgroupSize = readPositiveInteger(\n \"workgroupSize\",\n options.workgroupSize ?? WAVEFRONT_COMPUTE_WORKGROUP_SIZE,\n WAVEFRONT_COMPUTE_WORKGROUP_SIZE\n );\n if (workgroupSize !== WAVEFRONT_COMPUTE_WORKGROUP_SIZE) {\n throw new Error(`wavefront mesh compute currently requires workgroupSize=${WAVEFRONT_COMPUTE_WORKGROUP_SIZE}`);\n }\n return WAVEFRONT_COMPUTE_WGSL;\n}\n","import {\n assertShaderModuleCompiles,\n createComputePipeline,\n createRenderPipeline,\n} from \"./wavefront-runtime-support.js\";\nimport { PRESENT_WGSL, WAVEFRONT_COMPUTE_WGSL } from \"./wavefront-shaders.js\";\nimport { CONFIG_BUFFER_BYTES } from \"./wavefront-core.js\";\n\nexport function createWavefrontBindGroupLayouts(device, constants) {\n const trace = device.createBindGroupLayout({\n label: \"plasius.wavefront.traceBindGroupLayout\",\n entries: [\n { binding: 0, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 1, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 2, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 3, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 4, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n { binding: 6, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n {\n binding: 7,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba8unorm\" },\n },\n { binding: 8, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 9, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n {\n binding: 16,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba16float\" },\n },\n { binding: 19, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 20, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 21, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 22, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 23, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 24, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 25, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 26, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 27, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 28, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 29, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 30, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 31, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 32, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 33, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 34, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 35, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 36, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 37, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 38, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 39, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 40, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 41, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 42, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 43, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 44, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n ],\n });\n const acceleration = device.createBindGroupLayout({\n label: \"plasius.wavefront.accelerationBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n { binding: 8, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 9, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 10, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 11, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 12, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 13, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n ],\n });\n const denoiseRadiance = device.createBindGroupLayout({\n label: \"plasius.wavefront.denoiseRadianceBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n {\n binding: 14,\n visibility: constants.shader.COMPUTE,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 15,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba16float\" },\n },\n ],\n });\n const denoiseResolve = device.createBindGroupLayout({\n label: \"plasius.wavefront.denoiseResolveBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n {\n binding: 17,\n visibility: constants.shader.COMPUTE,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 18,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba8unorm\" },\n },\n ],\n });\n const present = device.createBindGroupLayout({\n label: \"plasius.wavefront.presentBindGroupLayout\",\n entries: [\n { binding: 0, visibility: constants.shader.FRAGMENT, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: constants.shader.FRAGMENT, sampler: { type: \"filtering\" } },\n ],\n });\n\n return Object.freeze({\n trace,\n acceleration,\n denoiseRadiance,\n denoiseResolve,\n present,\n });\n}\n\nexport function createWavefrontPipelineLayouts(device, bindGroupLayouts) {\n return Object.freeze({\n trace: device.createPipelineLayout({\n label: \"plasius.wavefront.tracePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.trace],\n }),\n acceleration: device.createPipelineLayout({\n label: \"plasius.wavefront.accelerationPipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.acceleration],\n }),\n denoiseRadiance: device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseRadiancePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.denoiseRadiance],\n }),\n denoiseResolve: device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseResolvePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.denoiseResolve],\n }),\n });\n}\n\nexport async function createWavefrontComputePipelines(device, computeShader, pipelineLayouts) {\n return Object.freeze({\n prepareMeshTrianglesAndLeaves: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"prepareMeshTrianglesAndLeaves\",\n \"plasius.wavefront.prepareMeshTrianglesAndLeaves\"\n ),\n sortBvhLeafRefs: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"sortBvhLeafRefs\",\n \"plasius.wavefront.sortBvhLeafRefs\"\n ),\n writeSortedBvhLeaves: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"writeSortedBvhLeaves\",\n \"plasius.wavefront.writeSortedBvhLeaves\"\n ),\n buildBvhInternalLevel: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"buildBvhInternalLevel\",\n \"plasius.wavefront.buildBvhInternalLevel\"\n ),\n generatePrimaryRays: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"generatePrimaryRays\",\n \"plasius.wavefront.generatePrimaryRays\"\n ),\n intersectActiveQueue: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"intersectActiveQueue\",\n \"plasius.wavefront.intersectActiveQueue\"\n ),\n resolveSurfaceRecords: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"resolveSurfaceRecords\",\n \"plasius.wavefront.resolveSurfaceRecords\"\n ),\n compactAndSwapQueues: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"compactAndSwapQueues\",\n \"plasius.wavefront.compactAndSwapQueues\"\n ),\n accumulateTerminalRadiance: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"accumulateTerminalRadiance\",\n \"plasius.wavefront.accumulateTerminalRadiance\"\n ),\n denoiseLinearRadiance: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.denoiseRadiance,\n \"denoiseLinearRadiance\",\n \"plasius.wavefront.denoiseLinearRadiance\"\n ),\n resolveDenoisedOutputImage: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.denoiseResolve,\n \"resolveDenoisedOutputImage\",\n \"plasius.wavefront.resolveDenoisedOutputImage\"\n ),\n });\n}\n\nexport async function createWavefrontPresentPipeline(device, presentBindGroupLayout, format) {\n const presentShader = device.createShaderModule({\n label: \"plasius.wavefront.presentShader\",\n code: PRESENT_WGSL,\n });\n return createRenderPipeline(device, {\n label: \"plasius.wavefront.presentPipeline\",\n layout: device.createPipelineLayout({\n label: \"plasius.wavefront.presentPipelineLayout\",\n bindGroupLayouts: [presentBindGroupLayout],\n }),\n vertex: { module: presentShader, entryPoint: \"vertexMain\" },\n fragment: {\n module: presentShader,\n entryPoint: \"fragmentMain\",\n targets: [{ format }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n}\n\nexport async function createWavefrontPipelineResources({ device, constants, format }) {\n const bindGroupLayouts = createWavefrontBindGroupLayouts(device, constants);\n const pipelineLayouts = createWavefrontPipelineLayouts(device, bindGroupLayouts);\n const computeShader = device.createShaderModule({\n label: \"plasius.wavefront.computeShader\",\n code: WAVEFRONT_COMPUTE_WGSL,\n });\n await assertShaderModuleCompiles(computeShader, \"plasius.wavefront.computeShader\");\n\n return Object.freeze({\n bindGroupLayouts,\n pipelineLayouts,\n computePipelines: await createWavefrontComputePipelines(\n device,\n computeShader,\n pipelineLayouts\n ),\n presentPipeline: await createWavefrontPresentPipeline(\n device,\n bindGroupLayouts.present,\n format\n ),\n });\n}\n","import {\n COUNTER_BUFFER_BYTES,\n COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET,\n COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET,\n COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET,\n COUNTER_TERMINATION_EMISSIVE_OFFSET,\n COUNTER_TERMINATION_ENVIRONMENT_OFFSET,\n COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET,\n COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET,\n COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET,\n COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET,\n COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET,\n COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET,\n COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_CHECKSUM_OFFSET,\n COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET,\n EMPTY_TERMINATION_METRICS,\n GPU_READBACK_COMPLETION_TIMEOUT_MS,\n TERMINATION_LUMINANCE_SCALE,\n clamp,\n readNonNegativeInteger,\n} from \"./wavefront-core.js\";\n\nexport async function readWavefrontTerminationMetrics({\n device,\n constants,\n counterBuffer,\n waitForSubmittedGpuWork,\n}) {\n const mapMode = constants.map;\n if (!mapMode) {\n return EMPTY_TERMINATION_METRICS;\n }\n const readback = device.createBuffer({\n label: \"plasius.wavefront.terminationMetrics\",\n size: COUNTER_BUFFER_BYTES,\n usage: constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n });\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.terminationMetrics.copy\",\n });\n encoder.copyBufferToBuffer(counterBuffer, 0, readback, 0, COUNTER_BUFFER_BYTES);\n device.queue.submit([encoder.finish()]);\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await readback.mapAsync(mapMode.READ);\n const countersView = new Uint32Array(readback.getMappedRange().slice(0));\n readback.unmap();\n readback.destroy?.();\n const emissive = countersView[COUNTER_TERMINATION_EMISSIVE_OFFSET] ?? 0;\n const environment = countersView[COUNTER_TERMINATION_ENVIRONMENT_OFFSET] ?? 0;\n const maxDepth = countersView[COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET] ?? 0;\n const queueOverflow = countersView[COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET] ?? 0;\n const invalidSamples = countersView[COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET] ?? 0;\n const legacyClampEquivalentSamples =\n countersView[COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET] ?? 0;\n const absorptionNull = countersView[COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET] ?? 0;\n const russianRoulette = countersView[COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET] ?? 0;\n const strictMaxDepth = countersView[COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET] ?? 0;\n const deterministicResidualZero =\n countersView[COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET] ?? 0;\n const directExplicitLuminance =\n (countersView[COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const cachedIndirectLuminance =\n (countersView[COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const stochasticResidualLuminance =\n (countersView[COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const zeroTerminationCount = countersView[COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET] ?? 0;\n const deterministicChecksum = countersView[COUNTER_TRANSPORT_CHECKSUM_OFFSET] ?? 0;\n const ambientResidualLuminance =\n (countersView[COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const totalLuminance =\n (countersView[COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const ambientResidualShare =\n totalLuminance > 0 ? ambientResidualLuminance / totalLuminance : 0;\n return Object.freeze({\n termination: Object.freeze({\n emissive,\n environment,\n ambientFallback: maxDepth + queueOverflow,\n maxDepth,\n absorptionNull,\n russianRoulette,\n strictMaxDepth,\n deterministicResidualZero,\n }),\n queueOverflow,\n terminalRadiance: Object.freeze({\n totalLuminance,\n ambientResidualLuminance,\n ambientResidualShare,\n }),\n radianceDiagnostics: Object.freeze({\n invalidSamples,\n legacyClampEquivalentSamples,\n }),\n transportContributions: Object.freeze({\n directExplicitLuminance,\n cachedIndirectLuminance,\n stochasticResidualLuminance,\n zeroTerminationCount,\n deterministicChecksum,\n }),\n });\n}\n\nexport async function readWavefrontOutputProbe({\n device,\n constants,\n config,\n outputTexture,\n waitForSubmittedGpuWork,\n optionsForProbe = {},\n}) {\n const mapMode = constants.map;\n if (!mapMode) {\n throw new Error(\"GPUMapMode.READ is unavailable in this environment.\");\n }\n const x = clamp(\n readNonNegativeInteger(\"x\", optionsForProbe.x, Math.floor(config.width / 2)),\n 0,\n config.width - 1\n );\n const y = clamp(\n readNonNegativeInteger(\"y\", optionsForProbe.y, Math.floor(config.height / 2)),\n 0,\n config.height - 1\n );\n const readback = device.createBuffer({\n label: \"plasius.wavefront.outputProbe\",\n size: 256,\n usage: constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n });\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.outputProbe.copy\",\n });\n encoder.copyTextureToBuffer(\n { texture: outputTexture, origin: { x, y } },\n { buffer: readback, bytesPerRow: 256, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 }\n );\n device.queue.submit([encoder.finish()]);\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await readback.mapAsync(mapMode.READ);\n const bytes = new Uint8Array(readback.getMappedRange()).slice(0, 4);\n readback.unmap();\n readback.destroy?.();\n return Object.freeze({\n x,\n y,\n rgba: Object.freeze(Array.from(bytes)),\n luminance: (0.2126 * bytes[0] + 0.7152 * bytes[1] + 0.0722 * bytes[2]) / 255,\n });\n}\n","import {\n DEFAULT_ENVIRONMENT_LIGHTING,\n add,\n asUnitVec3,\n asVec3,\n clamp,\n cross,\n dot,\n normalize,\n readFiniteNumber,\n readNonNegativeInteger,\n readPositiveInteger,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n sampleWavefrontDimension2D,\n WAVEFRONT_SAMPLE_DIMENSIONS,\n} from \"./wavefront-sampling-dimensions.js\";\nimport {\n distributionGgx,\n geometrySmith,\n hammersley,\n integrateBrdfSample,\n localToWorld,\n reflectVector,\n} from \"./wavefront-sampling.js\";\n\nfunction evaluateReferenceEnvironmentRadiance(config, origin, direction) {\n void origin;\n const rayDirection = normalize(direction, [0, 1, 0]);\n const upFactor = clamp(rayDirection[1] * 0.5 + 0.5, 0, 1);\n const sunDirection = normalize(\n config.environmentLighting?.sunDirection ?? DEFAULT_ENVIRONMENT_LIGHTING.sunDirection,\n DEFAULT_ENVIRONMENT_LIGHTING.sunDirection\n );\n const sunGlow = Math.pow(clamp(dot(rayDirection, sunDirection), 0, 1), 192);\n const horizonColor =\n config.environmentLighting?.horizonColor ?? DEFAULT_ENVIRONMENT_LIGHTING.horizonColor;\n const zenithColor =\n config.environmentLighting?.zenithColor ?? DEFAULT_ENVIRONMENT_LIGHTING.zenithColor;\n const sunColor = config.environmentLighting?.sunColor ?? DEFAULT_ENVIRONMENT_LIGHTING.sunColor;\n const intensity = Math.max(\n 0.0001,\n Number(config.environmentLighting?.intensity ?? DEFAULT_ENVIRONMENT_LIGHTING.intensity)\n );\n\n return Object.freeze([\n (horizonColor[0] * (1 - upFactor) + zenithColor[0] * upFactor + sunColor[0] * sunGlow) *\n intensity,\n (horizonColor[1] * (1 - upFactor) + zenithColor[1] * upFactor + sunColor[1] * sunGlow) *\n intensity,\n (horizonColor[2] * (1 - upFactor) + zenithColor[2] * upFactor + sunColor[2] * sunGlow) *\n intensity,\n 1,\n ]);\n}\n\nfunction normalizeReferenceTile(config, tileInput = {}) {\n const tileX = clamp(\n readNonNegativeInteger(\"tile.x\", tileInput.x, 0),\n 0,\n Math.max(0, config.width - 1)\n );\n const tileY = clamp(\n readNonNegativeInteger(\"tile.y\", tileInput.y, 0),\n 0,\n Math.max(0, config.height - 1)\n );\n const tileWidth = clamp(\n readPositiveInteger(\"tile.width\", tileInput.width, config.width - tileX),\n 1,\n config.width - tileX\n );\n const tileHeight = clamp(\n readPositiveInteger(\"tile.height\", tileInput.height, config.height - tileY),\n 1,\n config.height - tileY\n );\n\n return Object.freeze({\n x: tileX,\n y: tileY,\n width: tileWidth,\n height: tileHeight,\n });\n}\n\nfunction repairReferenceShadingNormal(geometricNormal, shadingNormal) {\n const normal = normalize(shadingNormal, geometricNormal);\n return dot(normal, geometricNormal) < 0 ? scale(normal, -1) : normal;\n}\n\nfunction readOptionalMaxDistance(value) {\n if (value === undefined || value === null) {\n return Number.POSITIVE_INFINITY;\n }\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0) {\n throw new Error(\"maxDistance must be a positive finite number when provided.\");\n }\n return numeric;\n}\n\nexport function createWavefrontReferenceRay(config, options = {}) {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"config must be a wavefront path tracing config.\");\n }\n\n const tile = normalizeReferenceTile(config, options.tile);\n const tilePixelCount = tile.width * tile.height;\n const pixelIndex = readNonNegativeInteger(\"pixelIndex\", options.pixelIndex, 0);\n if (pixelIndex >= tilePixelCount) {\n throw new Error(`pixelIndex ${pixelIndex} exceeds tile capacity ${tilePixelCount}.`);\n }\n\n const sampleIndex = readNonNegativeInteger(\"sampleIndex\", options.sampleIndex, 0);\n const frameIndex = readNonNegativeInteger(\"frameIndex\", options.frameIndex, config.frameIndex ?? 0);\n const jitterScale = clamp(readFiniteNumber(\"jitterScale\", options.jitterScale, 0.35), 0, 1);\n const localX = pixelIndex % tile.width;\n const localY = Math.floor(pixelIndex / tile.width);\n const pixelX = tile.x + localX;\n const pixelY = tile.y + localY;\n const sourcePixelId = pixelY * config.width + pixelX;\n const [jitterX, jitterY] = sampleWavefrontDimension2D(\n sourcePixelId,\n sampleIndex,\n 0,\n frameIndex,\n WAVEFRONT_SAMPLE_DIMENSIONS.cameraJitter,\n config.samplesPerPixel ?? 1\n ).map((value) => value - 0.5);\n const ndcX = ((pixelX + 0.5 + jitterX * jitterScale) / config.width) * 2 - 1;\n const ndcY = 1 - ((pixelY + 0.5 + jitterY * jitterScale) / config.height) * 2;\n const viewX = ndcX * config.camera.tanHalfFovY * config.camera.aspect;\n const viewY = ndcY * config.camera.tanHalfFovY;\n const direction = normalize(\n add(\n add(config.camera.forward, scale(config.camera.right, viewX)),\n scale(config.camera.up, viewY)\n ),\n config.camera.forward\n );\n\n return Object.freeze({\n rayId: pixelIndex,\n parentRayId: 0xffffffff,\n sourcePixelId,\n sampleId: sampleIndex,\n bounce: 0,\n mediumRefId: 0,\n mediumStackDepth: 0,\n mediumStack: Object.freeze([0, 0, 0, 0]),\n flags: 0,\n origin: Object.freeze([...config.camera.position]),\n direction: Object.freeze(direction),\n throughput: Object.freeze([1, 1, 1, 1]),\n pixelX,\n pixelY,\n });\n}\n\nexport function intersectWavefrontReferenceTriangle(ray, triangle, options = {}) {\n if (!ray || typeof ray !== \"object\") {\n throw new Error(\"ray must be a wavefront reference ray.\");\n }\n if (!triangle || typeof triangle !== \"object\") {\n throw new Error(\"triangle must be a wavefront triangle record.\");\n }\n\n const maxDistance = readOptionalMaxDistance(options.maxDistance);\n const triangleIndex = readNonNegativeInteger(\"triangleIndex\", options.triangleIndex, 0);\n const edge1 = subtract(triangle.v1, triangle.v0);\n const edge2 = subtract(triangle.v2, triangle.v0);\n const pvec = cross(ray.direction, edge2);\n const determinant = dot(edge1, pvec);\n if (Math.abs(determinant) < 0.0000001) {\n return null;\n }\n\n const invDet = 1 / determinant;\n const tvec = subtract(ray.origin, triangle.v0);\n const u = dot(tvec, pvec) * invDet;\n if (u < 0 || u > 1) {\n return null;\n }\n\n const qvec = cross(tvec, edge1);\n const v = dot(ray.direction, qvec) * invDet;\n if (v < 0 || u + v > 1) {\n return null;\n }\n\n const distance = dot(edge2, qvec) * invDet;\n if (distance <= 0.001 || distance > maxDistance) {\n return null;\n }\n\n const geometric = normalize(cross(edge1, edge2), [0, 1, 0]);\n const frontFace = dot(ray.direction, geometric) < 0;\n const orientedGeometric = frontFace ? geometric : scale(geometric, -1);\n const w = 1 - u - v;\n const interpolated = [\n triangle.n0[0] * w + triangle.n1[0] * u + triangle.n2[0] * v,\n triangle.n0[1] * w + triangle.n1[1] * u + triangle.n2[1] * v,\n triangle.n0[2] * w + triangle.n1[2] * u + triangle.n2[2] * v,\n ];\n const shadingNormal = repairReferenceShadingNormal(orientedGeometric, interpolated);\n const uv = [\n triangle.uv0[0] * w + triangle.uv1[0] * u + triangle.uv2[0] * v,\n triangle.uv0[1] * w + triangle.uv1[1] * u + triangle.uv2[1] * v,\n ];\n const position = add(ray.origin, scale(ray.direction, distance));\n\n return Object.freeze({\n hitType: \"surface\",\n rayId: ray.rayId,\n sourcePixelId: ray.sourcePixelId,\n distance,\n entityId: triangle.meshId,\n instanceId: 0,\n primitiveId: triangle.triangleId,\n materialId: triangle.materialKind,\n materialRefId: triangle.materialRefId,\n mediumRefId: triangle.mediumRefId,\n barycentrics: Object.freeze([w, u, v]),\n uv: Object.freeze(uv),\n geometricNormal: Object.freeze(orientedGeometric),\n shadingNormal: Object.freeze(shadingNormal),\n frontFace,\n triangleIndex,\n triangleId: triangle.triangleId,\n position: Object.freeze(position),\n color: triangle.color,\n emission: triangle.emission,\n material: triangle.material,\n materialResponse: triangle.materialResponse,\n });\n}\n\nfunction createWavefrontReferenceEnvironmentHit(config, ray) {\n const radiance = evaluateReferenceEnvironmentRadiance(config, ray.origin, ray.direction);\n return Object.freeze({\n hitType: \"environment\",\n rayId: ray.rayId,\n sourcePixelId: ray.sourcePixelId,\n distance: -1,\n entityId: 0,\n instanceId: 0,\n primitiveId: 0,\n materialId: 0,\n materialRefId: 0,\n mediumRefId: 0,\n barycentrics: Object.freeze([0, 0, 0]),\n uv: Object.freeze([0, 0]),\n geometricNormal: Object.freeze(scale(ray.direction, -1)),\n shadingNormal: Object.freeze(scale(ray.direction, -1)),\n frontFace: true,\n triangleIndex: -1,\n triangleId: -1,\n position: Object.freeze(add(ray.origin, scale(ray.direction, 1000))),\n color: Object.freeze([0, 0, 0, 0]),\n emission: radiance,\n material: Object.freeze([1, 0, 1, 1]),\n materialResponse: Object.freeze([0, 0, 0, 0]),\n });\n}\n\nexport function traceWavefrontReferenceTriangles(config, ray, triangles, options = {}) {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"config must be a wavefront path tracing config.\");\n }\n\n const source = Array.isArray(triangles) ? triangles : [];\n let nearestHit = null;\n let nearestDistance = readOptionalMaxDistance(options.maxDistance);\n\n source.forEach((triangle, index) => {\n const hit = intersectWavefrontReferenceTriangle(ray, triangle, {\n maxDistance: Number.isFinite(nearestDistance) ? nearestDistance : undefined,\n triangleIndex: index,\n });\n if (hit && hit.distance < nearestDistance) {\n nearestDistance = hit.distance;\n nearestHit = hit;\n }\n });\n\n return nearestHit ?? createWavefrontReferenceEnvironmentHit(config, ray);\n}\n\nfunction maxComponentVec3(value) {\n return Math.max(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\n}\n\nfunction clampVec3(value, min = 0, max = 1) {\n const minVec = Array.isArray(min) ? min : [min, min, min];\n const maxVec = Array.isArray(max) ? max : [max, max, max];\n return [\n clamp(Number(value?.[0]) || 0, minVec[0], maxVec[0]),\n clamp(Number(value?.[1]) || 0, minVec[1], maxVec[1]),\n clamp(Number(value?.[2]) || 0, minVec[2], maxVec[2]),\n ];\n}\n\nfunction maxVec3(left, right) {\n return [\n Math.max(left[0] ?? 0, right[0] ?? 0),\n Math.max(left[1] ?? 0, right[1] ?? 0),\n Math.max(left[2] ?? 0, right[2] ?? 0),\n ];\n}\n\nfunction multiplyVec3(left, right) {\n return [\n (left[0] ?? 0) * (right[0] ?? 0),\n (left[1] ?? 0) * (right[1] ?? 0),\n (left[2] ?? 0) * (right[2] ?? 0),\n ];\n}\n\nfunction addVec3(left, right) {\n return [\n (left[0] ?? 0) + (right[0] ?? 0),\n (left[1] ?? 0) + (right[1] ?? 0),\n (left[2] ?? 0) + (right[2] ?? 0),\n ];\n}\n\nfunction mixScalar(a, b, factor) {\n return a * (1 - factor) + b * factor;\n}\n\nfunction mixVec3(left, right, factor) {\n return [\n mixScalar(left[0] ?? 0, right[0] ?? 0, factor),\n mixScalar(left[1] ?? 0, right[1] ?? 0, factor),\n mixScalar(left[2] ?? 0, right[2] ?? 0, factor),\n ];\n}\n\nfunction sanitizeWavefrontPdf(value) {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return value;\n}\n\nfunction sanitizeWavefrontThroughputComponent(value) {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.min(value, 65504);\n}\n\nfunction sanitizeWavefrontThroughput(value) {\n return [\n sanitizeWavefrontThroughputComponent(value?.[0]),\n sanitizeWavefrontThroughputComponent(value?.[1]),\n sanitizeWavefrontThroughputComponent(value?.[2]),\n ];\n}\n\nfunction coerceWavefrontVec3(value, fallback) {\n const source = Array.isArray(value) ? value : [];\n return [\n Number.isFinite(source[0]) ? Number(source[0]) : fallback[0],\n Number.isFinite(source[1]) ? Number(source[1]) : fallback[1],\n Number.isFinite(source[2]) ? Number(source[2]) : fallback[2],\n ];\n}\n\nfunction sanitizeWavefrontSampleRadiance(value) {\n return [\n sanitizeWavefrontThroughputComponent(value?.[0]),\n sanitizeWavefrontThroughputComponent(value?.[1]),\n sanitizeWavefrontThroughputComponent(value?.[2]),\n ];\n}\n\nfunction fresnelSchlick(cosine, f0) {\n const factor = (1 - clamp(Number(cosine) || 0, 0, 1)) ** 5;\n return [\n (f0[0] ?? 0) + (1 - (f0[0] ?? 0)) * factor,\n (f0[1] ?? 0) + (1 - (f0[1] ?? 0)) * factor,\n (f0[2] ?? 0) + (1 - (f0[2] ?? 0)) * factor,\n ];\n}\n\nfunction normalizeWavefrontReferenceHit(input = {}) {\n const material = Array.isArray(input.material) ? input.material : [];\n const materialResponse = Array.isArray(input.materialResponse) ? input.materialResponse : [];\n const materialExtension = Array.isArray(input.materialExtension) ? input.materialExtension : [];\n return Object.freeze({\n color: Object.freeze(coerceWavefrontVec3(input.color, [0.8, 0.8, 0.8])),\n shadingNormal: Object.freeze(\n normalize(coerceWavefrontVec3(input.shadingNormal, [0, 1, 0]), [0, 1, 0])\n ),\n material: Object.freeze([\n clamp(Number(material[0] ?? input.roughness ?? 0.45) || 0, 0, 1),\n clamp(Number(material[1] ?? input.metallic ?? 0) || 0, 0, 1),\n clamp(Number(material[2] ?? 1) || 1, 0, 1),\n clamp(Number(material[3] ?? 1.45) || 1.45, 1, 3),\n ]),\n materialResponse: Object.freeze([\n clamp(Number(materialResponse[0] ?? input.sheen ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[1] ?? input.sheenTint ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[2] ?? input.anisotropy ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[3] ?? input.clearcoat ?? 0) || 0, 0, 1),\n ]),\n materialExtension: Object.freeze([\n clamp(Number(materialExtension[0] ?? input.clearcoatRoughness ?? 0.08) || 0, 0, 1),\n clamp(Number(materialExtension[1] ?? input.specularWeight ?? 1) || 0, 0, 1),\n clamp(Number(materialExtension[2] ?? input.transmission ?? 0) || 0, 0, 1),\n clamp(Number(materialExtension[3] ?? 0) || 0, 0, 1),\n ]),\n specularColor: Object.freeze(coerceWavefrontVec3(input.specularColor, [1, 1, 1])),\n occlusion: clamp(Number(input.occlusion ?? 1) || 0, 0, 1),\n materialKind: readNonNegativeInteger(\"materialKind\", input.materialKind, 0),\n position: Object.freeze(coerceWavefrontVec3(input.position, [0, 0, 0])),\n });\n}\n\nfunction surfaceSpecularF0Reference(hit, surfaceColor) {\n const metallic = clamp(hit.material[1], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const specularColor = clampVec3(hit.specularColor, 0, 1);\n const dielectricF0 = specularColor.map((value) => 0.04 * specularWeight * value);\n return mixVec3(dielectricF0, surfaceColor, metallic);\n}\n\nfunction surfaceBsdfSamplingWeightsReference(hit) {\n const metallic = clamp(hit.material[1], 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const diffuseWeight = clamp(\n (1 - metallic) * Math.max(1 - specularWeight * 0.5 - clearcoat * 0.25, 0.15),\n 0,\n 1\n );\n const specWeight = clamp(\n Math.max(metallic, specularWeight * 0.75) * (1 - clearcoat * 0.5),\n 0,\n 1\n );\n const clearcoatWeight = clamp(clearcoat, 0, 1);\n const totalWeight = Math.max(diffuseWeight + specWeight + clearcoatWeight, 0.000001);\n return Object.freeze([\n diffuseWeight / totalWeight,\n specWeight / totalWeight,\n clearcoatWeight / totalWeight,\n ]);\n}\n\nfunction evaluateWavefrontSurfaceBsdfReference(hitInput, viewDirectionInput, lightDirectionInput, ambientColor = [0.018, 0.022, 0.026]) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const viewDirection = normalize(viewDirectionInput, normal);\n const lightDirection = normalize(lightDirectionInput, normal);\n const surfaceColor = clampVec3(maxVec3(hit.color, scale(asVec3(ambientColor, [0.018, 0.022, 0.026]), 0.35)), 0, 1);\n const roughness = clamp(hit.material[0], 0, 1);\n const metallic = clamp(hit.material[1], 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const clearcoatRoughness = clamp(hit.materialExtension[0], 0, 1);\n const occlusion = clamp(hit.occlusion, 0, 1);\n const nDotV = clamp(dot(normal, viewDirection), 0, 1);\n const nDotL = clamp(dot(normal, lightDirection), 0, 1);\n if (nDotV <= 0 || nDotL <= 0) {\n return Object.freeze([0, 0, 0]);\n }\n const halfVector = normalize(add(viewDirection, lightDirection), normal);\n const vDotH = clamp(dot(viewDirection, halfVector), 0, 1);\n const f0 = surfaceSpecularF0Reference(hit, surfaceColor);\n const fresnel = fresnelSchlick(vDotH, f0);\n const nDotH = clamp(dot(normal, halfVector), 0, 1);\n const distribution = distributionGgx(nDotH, roughness);\n const geometry = geometrySmith(nDotV, nDotL, roughness);\n const specular = fresnel.map(\n (value) => (distribution * geometry * value) / Math.max(4 * nDotV * nDotL, 0.000001)\n );\n const diffuseWeight =\n (1 - metallic) * (1 - clearcoat * 0.24) * (1 - clamp(maxComponentVec3(fresnel), 0, 0.98));\n const diffuse = surfaceColor.map((value) => (value * diffuseWeight) / Math.PI);\n const clearcoatHalf = normalize(add(viewDirection, lightDirection), normal);\n const clearcoatVDotH = clamp(dot(viewDirection, clearcoatHalf), 0, 1);\n const clearcoatDistribution = distributionGgx(\n clamp(dot(normal, clearcoatHalf), 0, 1),\n Math.max(clearcoatRoughness, 0.02)\n );\n const clearcoatGeometry = geometrySmith(nDotV, nDotL, Math.max(clearcoatRoughness, 0.02));\n const clearcoatFresnel = fresnelSchlick(clearcoatVDotH, [0.04, 0.04, 0.04]);\n const clearcoatTerm = clearcoatFresnel.map(\n (value) =>\n ((clearcoatDistribution * clearcoatGeometry * value) /\n Math.max(4 * nDotV * nDotL, 0.000001)) *\n clearcoat\n );\n const occlusionWeight = mixScalar(0.42, 1, occlusion);\n return Object.freeze(\n addVec3(addVec3(diffuse, specular), clearcoatTerm).map((value) => value * occlusionWeight)\n );\n}\n\nfunction diffusePdfReference(normal, lightDirection) {\n return clamp(dot(normal, lightDirection), 0, 1) / Math.PI;\n}\n\nfunction ggxPdfReference(normal, viewDirection, lightDirection, roughness) {\n const halfVector = normalize(add(viewDirection, lightDirection), normal);\n const nDotH = clamp(dot(normal, halfVector), 0, 1);\n const vDotH = clamp(dot(viewDirection, halfVector), 0, 1);\n const distribution = distributionGgx(nDotH, roughness);\n return (distribution * nDotH) / Math.max(4 * vDotH, 0.000001);\n}\n\nfunction evaluateWavefrontSurfaceBsdfPdfReference(hitInput, viewDirectionInput, lightDirectionInput) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const viewDirection = normalize(viewDirectionInput, normal);\n const lightDirection = normalize(lightDirectionInput, normal);\n const roughness = clamp(hit.material[0], 0, 1);\n const weights = surfaceBsdfSamplingWeightsReference(hit);\n return (\n weights[0] * diffusePdfReference(normal, lightDirection) +\n weights[1] * ggxPdfReference(normal, viewDirection, lightDirection, Math.max(roughness, 0.02)) +\n weights[2] *\n ggxPdfReference(\n normal,\n viewDirection,\n lightDirection,\n Math.max(clamp(hit.materialExtension[0], 0, 1), 0.02)\n )\n );\n}\n\nfunction surfaceGlossinessReference(hitInput) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const roughness = clamp(hit.material[0], 0, 1);\n const metallic = clamp(hit.material[1], 0, 1);\n const sheen = clamp(maxComponentVec3(hit.materialResponse), 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const transmission = clamp(hit.materialExtension[2], 0, 1);\n const baseGloss = Math.max(\n clearcoat,\n Math.max(sheen * 0.72, Math.max(specularWeight * (0.38 + metallic * 0.62), transmission))\n );\n return clamp(baseGloss * (1 - roughness * 0.72) + metallic * (1 - roughness) * 0.35, 0, 1);\n}\n\nfunction glossyEnvironmentDirectionReference(incidentDirection, normal, roughness, normalBlendScale) {\n const reflectionDirection = reflectVector(incidentDirection, normal);\n const blend = clamp(roughness * roughness * normalBlendScale, 0, 0.92);\n return normalize(\n add(scale(reflectionDirection, 1 - blend), scale(normal, blend)),\n normal\n );\n}\n\nfunction wavefrontPowerHeuristicReference(pdfA, pdfB) {\n const a = sanitizeWavefrontPdf(pdfA);\n const b = sanitizeWavefrontPdf(pdfB);\n if (a <= 0) {\n return 0;\n }\n const a2 = a * a;\n const b2 = b * b;\n return a2 / Math.max(a2 + b2, 0.000001);\n}\n\nfunction sunlitBaselineRadianceReference(configInput, normal) {\n const config = configInput ?? {};\n const baseline = Math.max(\n 0,\n Number(config.environmentLighting?.sunlitBaseline ?? config.pathResolveBaseline ?? 0.16)\n );\n if (baseline <= 0.000001) {\n return [0, 0, 0];\n }\n const sunDirection = asUnitVec3(\n config.environmentLighting?.sunDirection,\n DEFAULT_ENVIRONMENT_LIGHTING.sunDirection\n );\n const sunFacing = clamp(dot(normal, sunDirection), 0, 1);\n const skyFacing = 0.35 + clamp(normal[1] * 0.5 + 0.5, 0, 1) * 0.65;\n const directionalWeight = 0.38 + sunFacing * 0.62;\n const sunTint = maxVec3(asVec3(config.environmentLighting?.sunColor, DEFAULT_ENVIRONMENT_LIGHTING.sunColor), [0, 0, 0]);\n return sanitizeWavefrontSampleRadiance(\n sunTint.map((value) => value * baseline * skyFacing * directionalWeight * 0.04)\n );\n}\n\nexport function validateWavefrontBsdfSample({\n hit,\n viewDirection = [0, 1, 0],\n lightDirection = [0, 1, 0],\n sampledPdf,\n lightPdf = 0,\n ambientColor = [0.018, 0.022, 0.026],\n} = {}) {\n const normalizedHit = normalizeWavefrontReferenceHit(hit);\n const normal = normalize(normalizedHit.shadingNormal, [0, 1, 0]);\n const resolvedViewDirection = normalize(viewDirection, normal);\n const resolvedLightDirection = normalize(lightDirection, normal);\n const bsdf = evaluateWavefrontSurfaceBsdfReference(\n normalizedHit,\n resolvedViewDirection,\n resolvedLightDirection,\n ambientColor\n );\n const expectedPdf = evaluateWavefrontSurfaceBsdfPdfReference(\n normalizedHit,\n resolvedViewDirection,\n resolvedLightDirection\n );\n const resolvedSampledPdf =\n sampledPdf === undefined ? expectedPdf : sanitizeWavefrontPdf(sampledPdf);\n const nDotL = clamp(dot(normal, resolvedLightDirection), 0, 1);\n const continuationThroughput =\n resolvedSampledPdf <= 0.000001\n ? [0, 0, 0]\n : sanitizeWavefrontThroughput(\n bsdf.map((value) => value * (nDotL / Math.max(resolvedSampledPdf, 0.000001)))\n );\n const pdfTolerance = Math.max(0.00005, expectedPdf * 0.05);\n return Object.freeze({\n bsdf: Object.freeze(bsdf),\n expectedPdf,\n sampledPdf: resolvedSampledPdf,\n lightPdf: sanitizeWavefrontPdf(lightPdf),\n misWeight: wavefrontPowerHeuristicReference(lightPdf, resolvedSampledPdf),\n continuationThroughput: Object.freeze(continuationThroughput),\n pdfMismatch: Math.abs(resolvedSampledPdf - expectedPdf) > pdfTolerance,\n });\n}\n\nexport function estimateWavefrontDirectionalHemisphericalReflectance(\n hit,\n viewDirection = [0, 1, 0],\n options = {}\n) {\n const normalizedHit = normalizeWavefrontReferenceHit(hit);\n const normal = normalize(normalizedHit.shadingNormal, [0, 1, 0]);\n const resolvedViewDirection = normalize(viewDirection, normal);\n const sampleCount = Math.max(32, readPositiveInteger(\"sampleCount\", options.sampleCount, 512));\n let total = [0, 0, 0];\n for (let index = 0; index < sampleCount; index += 1) {\n const sample = hammersley(index, sampleCount);\n const phi = sample[0] * 2 * Math.PI;\n const cosTheta = sample[1];\n const sinTheta = Math.sqrt(Math.max(1 - cosTheta * cosTheta, 0));\n const lightDirection = localToWorld(\n [Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta],\n normal\n );\n const bsdf = evaluateWavefrontSurfaceBsdfReference(\n normalizedHit,\n resolvedViewDirection,\n lightDirection,\n options.ambientColor ?? [0.018, 0.022, 0.026]\n );\n const nDotL = clamp(dot(normal, lightDirection), 0, 1);\n total = addVec3(total, bsdf.map((value) => value * nDotL * ((2 * Math.PI) / sampleCount)));\n }\n return Object.freeze(clampVec3(total, 0, 4));\n}\n\nexport function computeWavefrontTerminalEnvironmentContributionReference(\n configInput = {},\n rayInput = {},\n throughputInput = [1, 1, 1],\n hitInput = {}\n) {\n const config = configInput ?? {};\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const origin = add(hit.position, scale(normal, 0.003));\n const roughness = clamp(hit.material[0], 0, 1);\n const glossiness = surfaceGlossinessReference(hit);\n const rayDirection = normalize(rayInput.direction ?? [0, -1, 0], [0, -1, 0]);\n const viewDirection = normalize(scale(rayDirection, -1), normal);\n const normalEnvironment = evaluateReferenceEnvironmentRadiance(config, origin, normal).slice(0, 3);\n const reflectionDirection = glossyEnvironmentDirectionReference(\n rayDirection,\n normal,\n roughness,\n mixScalar(0.88, 0.38, glossiness)\n );\n const reflectionEnvironment = evaluateReferenceEnvironmentRadiance(\n config,\n origin,\n reflectionDirection\n ).slice(0, 3);\n const surfaceColor = clampVec3(\n maxVec3(hit.color, scale(asVec3(config.ambientColor, [0.018, 0.022, 0.026]), 0.35)),\n 0,\n 1\n );\n const f0 = surfaceSpecularF0Reference(hit, surfaceColor);\n const [brdfScale, brdfBias] = integrateBrdfSample(\n clamp(dot(normal, viewDirection), 0, 1),\n roughness,\n 128\n );\n const specularEnvironment = multiplyVec3(\n reflectionEnvironment,\n addVec3(scale(f0, brdfScale), [brdfBias, brdfBias, brdfBias])\n );\n const sunlitFloor = sunlitBaselineRadianceReference(config, normal);\n const ambientColor = asVec3(config.ambientColor, [0.018, 0.022, 0.026]);\n const ambientFloor = maxVec3(ambientColor, scale(sunlitFloor, 0.82));\n const environmentInfluence = Math.max(\n 0.12,\n Number(config.environmentLighting?.sunlitBaseline ?? config.pathResolveBaseline ?? 0.16) * 0.42\n );\n const glossyEnvironment = maxVec3(\n normalEnvironment,\n maxVec3(\n scale(reflectionEnvironment, mixScalar(0.24, 0.92, glossiness)),\n specularEnvironment\n )\n );\n const environmentFloor = maxVec3(\n ambientFloor,\n maxVec3(sunlitFloor, scale(glossyEnvironment, environmentInfluence))\n );\n const materialFloor = hit.materialKind === 0 || hit.materialKind === 3 ? 1 : 0.7;\n const source = sanitizeWavefrontSampleRadiance(scale(environmentFloor, materialFloor));\n const occlusion = mixScalar(0.75, 1, clamp(hit.occlusion, 0, 1));\n const contribution = sanitizeWavefrontSampleRadiance(\n scale(\n multiplyVec3(\n multiplyVec3(sanitizeWavefrontThroughput(throughputInput), maxVec3(hit.color, ambientColor)),\n source\n ),\n occlusion\n )\n );\n return Object.freeze({\n source: Object.freeze(source),\n contribution: Object.freeze(contribution),\n });\n}\n","import {\n createGpuParallelismCounters,\n createGpuParallelismDiagnostics,\n createWavefrontTransportGuardrailSummary,\n createGpuWorkerJobDiagnostics,\n} from \"./wavefront-frame-runtime.js\"\nimport { dispatchWavefrontGpuAccelerationBuild } from \"./wavefront-acceleration-builder.js\";\nimport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n} from \"./wavefront-scene-data.js\";\nimport {\n estimateWavefrontPathTracingMemoryForConfig,\n createWavefrontPathTracingComputeConfig,\n packEnvironmentPortals,\n supportsWavefrontPathTracingCompute,\n} from \"./wavefront-config.js\";\nimport {\n clampTileSizeForDevice,\n createAtlasTextureResource,\n createBrdfLutResource,\n createBuffer,\n createEnvironmentMapResource,\n createEnvironmentSamplingTextureResource,\n createMediumTextureResource,\n mediumTablesEqual,\n} from \"./wavefront-gpu-resources.js\";\nimport {\n createConfigPayload,\n createTiles,\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n} from \"./wavefront-packers.js\";\nimport {\n createWavefrontBvhBuildBindGroup,\n createWavefrontDenoiseBindGroups,\n createWavefrontPresentBindGroup,\n createWavefrontTraceBindGroups,\n} from \"./wavefront-bind-groups.js\";\nimport {\n waitForSubmittedGpuWork as waitForSubmittedGpuWorkForDevice,\n} from \"./wavefront-gpu-synchronization.js\";\nimport {\n createWavefrontFrameStats,\n resolveWavefrontRenderedSamplesPerPixel,\n} from \"./wavefront-frame-stats.js\";\nimport {\n createWavefrontFrameTelemetryResources,\n createWavefrontFrameTimingTelemetry,\n createWavefrontRayCountTelemetry,\n} from \"./wavefront-frame-telemetry.js\";\nimport { createWavefrontFrameEncoder } from \"./wavefront-frame-encoder.js\";\nimport {\n dispatchWavefrontFrame,\n dispatchWavefrontFrameAwaitingGpu,\n} from \"./wavefront-frame-dispatcher.js\";\nimport { createWavefrontPipelineResources } from \"./wavefront-pipelines.js\";\nimport {\n readWavefrontOutputProbe,\n readWavefrontTerminationMetrics,\n} from \"./wavefront-readbacks.js\";\nimport {\n createEnvironmentMapSnapshot,\n createGpuAdapterParallelismDiagnostics,\n createWavefrontDeviceDescriptor,\n estimateSubmittedGpuWorkTiming,\n getGpuUsageConstants,\n nowMs,\n resolveCanvas,\n} from \"./wavefront-runtime-support.js\";\n\nimport {\n BVH_NODE_RECORD_BYTES,\n DEFAULT_AMBIENT_COLOR,\n DEFAULT_BRDF_LUT_SAMPLE_COUNT,\n DEFAULT_BRDF_LUT_SIZE,\n DEFAULT_CAMERA,\n DEFAULT_ENVIRONMENT_COLOR,\n DEFAULT_ENVIRONMENT_LIGHTING,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY,\n DEFAULT_HEIGHT,\n DEFAULT_MAX_DEPTH,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION,\n DEFAULT_MEDIUM_PHASE_MODEL,\n DEFAULT_SAMPLES_PER_PIXEL,\n DEFAULT_SCENE_OBJECT_CAPACITY,\n DEFAULT_TILE_SIZE,\n DEFAULT_WIDTH,\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n EMPTY_TERMINATION_METRICS,\n GPU_MATERIAL_RECORD_BYTES,\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n HIT_TYPE_EMISSIVE,\n HIT_TYPE_SURFACE,\n MATERIAL_DIELECTRIC,\n MATERIAL_DIFFUSE,\n MATERIAL_EMISSIVE,\n MATERIAL_METAL,\n MATERIAL_TRANSPARENT,\n MAX_PATH_TRACING_DEPTH,\n MAX_SAMPLES_PER_PIXEL,\n MEDIUM_TABLE_ROWS,\n OBJECT_KIND_BOX,\n OBJECT_KIND_SPHERE,\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH,\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW,\n TERMINAL_SOURCE_KIND_EMISSIVE,\n TERMINAL_SOURCE_KIND_ENVIRONMENT,\n TRACE_STORAGE_BUFFER_BINDINGS,\n add,\n asColor,\n asUnitVec3,\n asVec3,\n assertAnalyticDisplayQualityPolicy,\n boundsCentroid,\n cross,\n dot,\n emissionPower,\n getArrayLikeLength,\n maxComponent,\n mergeBounds,\n mixSeed,\n normalize,\n random01FromSeed,\n readFiniteNumber,\n readVector,\n readVector2,\n resolveDeferredPathResolve,\n resolveEnvironmentMap,\n resolveSheenColor,\n scale,\n subtract,\n triangleBounds,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-core.js\";\n\nfunction triangleAreaForLightSampling(triangle) {\n if (!triangle) {\n return 1;\n }\n const edge1 = subtract(triangle.v1, triangle.v0);\n const edge2 = subtract(triangle.v2, triangle.v0);\n return Math.max(Math.hypot(...cross(edge1, edge2)) * 0.5, 0.000001);\n}\n\nfunction emissiveTriangleWeight(triangle) {\n if (!triangle) {\n return 1;\n }\n return triangleAreaForLightSampling(triangle) * Math.max(emissionPower(triangle.emission), 0.000001);\n}\n\nfunction resolveOrderedEmissiveTriangleIndices(config) {\n const triangleIndexById = new Map(\n config.meshAcceleration.triangles.map((triangle, index) => [triangle.triangleId, index])\n );\n return config.emissiveTriangleIndices.indices\n .map((triangleId) => triangleIndexById.get(triangleId))\n .filter((triangleIndex) => Number.isInteger(triangleIndex));\n}\n\nexport async function createWavefrontPathTracingComputeRenderer(options = {}) {\n assertAnalyticDisplayQualityPolicy(options);\n const constants = getGpuUsageConstants();\n const navigatorRef = options.navigator ?? globalThis.navigator;\n if (!supportsWavefrontPathTracingCompute({ navigator: navigatorRef })) {\n throw new Error(\"WebGPU wavefront path tracing requires navigator.gpu.\");\n }\n\n const canvas = resolveCanvas(options.canvas, options.document);\n const initialConfig = createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n });\n const adapter = await navigatorRef.gpu.requestAdapter({\n powerPreference: options.powerPreference ?? \"high-performance\",\n });\n if (!adapter) {\n throw new Error(\"Unable to acquire a WebGPU adapter for wavefront path tracing.\");\n }\n\n const device = await adapter.requestDevice(\n createWavefrontDeviceDescriptor(adapter, options, initialConfig.memory)\n );\n const gpuAdapterParallelism = createGpuAdapterParallelismDiagnostics(adapter, device);\n const context = canvas.getContext(\"webgpu\");\n if (!context || typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n\n const format =\n options.format ??\n (typeof navigatorRef.gpu.getPreferredCanvasFormat === \"function\"\n ? navigatorRef.gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n let config = initialConfig;\n const safeTileSize = clampTileSizeForDevice(config, device);\n if (safeTileSize !== config.tileSize) {\n config = createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n width: config.width,\n height: config.height,\n tileSize: safeTileSize,\n tilePixelCapacity: Math.min(\n config.tilePixelCapacity,\n safeTileSize * safeTileSize\n ),\n });\n }\n config = Object.freeze({\n ...config,\n memory: estimateWavefrontPathTracingMemoryForConfig(config, device.limits),\n });\n canvas.width = config.width;\n canvas.height = config.height;\n context.configure({\n device,\n format,\n alphaMode: options.alpha === true ? \"premultiplied\" : \"opaque\",\n });\n\n const bufferUsage = constants.buffer.STORAGE | constants.buffer.COPY_DST;\n const memory = config.memory;\n const activeQueue = createBuffer(device, bufferUsage, memory.queueBytes, \"plasius.wavefront.activeQueue\");\n const nextQueue = createBuffer(device, bufferUsage, memory.queueBytes, \"plasius.wavefront.nextQueue\");\n const hitBuffer = createBuffer(device, bufferUsage, memory.hitBytes, \"plasius.wavefront.hitBuffer\");\n const accumulationBuffer = createBuffer(\n device,\n bufferUsage,\n memory.accumulationBytes,\n \"plasius.wavefront.accumulation\"\n );\n const pathVertexBuffer = createBuffer(\n device,\n bufferUsage,\n memory.pathVertexBytes,\n \"plasius.wavefront.pathVertices\"\n );\n const sceneObjectBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.sceneObjectBytes,\n \"plasius.wavefront.sceneObjects\"\n );\n const triangleBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.triangleBytes,\n \"plasius.wavefront.triangles\"\n );\n const bvhNodeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.bvhCombinedBytes,\n \"plasius.wavefront.bvhNodes\"\n );\n const meshVertexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshVertexBytes,\n \"plasius.wavefront.meshVertices\"\n );\n const meshIndexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshIndexBytes,\n \"plasius.wavefront.meshIndices\"\n );\n const meshRangeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshRangeBytes,\n \"plasius.wavefront.meshRanges\"\n );\n const environmentPortalBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.environmentPortalBytes,\n \"plasius.wavefront.environmentPortals\"\n );\n const bvhLeafRefBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.bvhLeafReferenceBytes,\n \"plasius.wavefront.bvhLeafRefs\"\n );\n const tiles = createTiles(config.width, config.height, config.tileSize);\n const configBufferStride = memory.configBufferStride;\n const outputConfigSlotCount = config.deferredPathResolve ? 0 : tiles.length;\n const frameConfigSlotCount = Math.max(\n 1,\n tiles.length * config.samplesPerPixel + outputConfigSlotCount + (config.denoise ? 1 : 0)\n );\n const configBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n memory.frameConfigBytes,\n \"plasius.wavefront.frameConfig\"\n );\n const bvhBuildConfigBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n memory.bvhBuildConfigBytes,\n \"plasius.wavefront.bvhBuildConfig\"\n );\n const counterBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n memory.counterBytes,\n \"plasius.wavefront.counters\"\n );\n const activeDispatchBuffer = createBuffer(\n device,\n constants.buffer.INDIRECT | constants.buffer.COPY_DST,\n memory.indirectDispatchBytes,\n \"plasius.wavefront.activeDispatchArgs\"\n );\n\n let packedScene = packWavefrontSceneObjects(config.sceneObjects, config.sceneObjectCapacity);\n device.queue.writeBuffer(sceneObjectBuffer, 0, packedScene.buffer);\n const packedTriangles = packWavefrontTriangles(\n config.meshAcceleration.triangles,\n Math.max(1, config.triangleCapacity)\n );\n const packedBvhNodes = packWavefrontBvhNodes(\n config.meshAcceleration.nodes,\n Math.max(1, config.bvhNodeCapacity + config.emissiveTriangleCapacity)\n );\n const packedBvhNodeUints = new Uint32Array(packedBvhNodes.buffer);\n const packedBvhNodeFloats = new Float32Array(packedBvhNodes.buffer);\n const orderedEmissiveTriangleIndices = resolveOrderedEmissiveTriangleIndices(config);\n const emissiveWeights = orderedEmissiveTriangleIndices.map((triangleIndex) =>\n emissiveTriangleWeight(config.meshAcceleration.triangles[triangleIndex])\n );\n const totalEmissiveWeight = emissiveWeights.reduce((total, weight) => total + weight, 0);\n let cumulativeEmissiveWeight = 0;\n orderedEmissiveTriangleIndices.forEach((triangleIndex, index) => {\n const nodeOffset = (config.bvhNodeCapacity + index) * (BVH_NODE_RECORD_BYTES / 4);\n cumulativeEmissiveWeight += emissiveWeights[index] ?? 0;\n packedBvhNodeFloats[nodeOffset] = cumulativeEmissiveWeight;\n packedBvhNodeFloats[nodeOffset + 1] = emissiveWeights[index] ?? 0;\n packedBvhNodeFloats[nodeOffset + 2] = totalEmissiveWeight;\n packedBvhNodeUints[nodeOffset + 8] = triangleIndex;\n });\n device.queue.writeBuffer(triangleBuffer, 0, packedTriangles.buffer);\n device.queue.writeBuffer(bvhNodeBuffer, 0, packedBvhNodes.buffer);\n device.queue.writeBuffer(meshVertexBuffer, 0, config.gpuMeshSource.vertices.buffer);\n device.queue.writeBuffer(meshIndexBuffer, 0, config.gpuMeshSource.indices.buffer);\n device.queue.writeBuffer(meshRangeBuffer, 0, config.gpuMeshSource.meshes.buffer);\n const packedEnvironmentPortals = packEnvironmentPortals(\n config.environmentPortals,\n Math.max(1, config.environmentPortalCapacity)\n );\n device.queue.writeBuffer(environmentPortalBuffer, 0, packedEnvironmentPortals.buffer);\n\n const radianceTexture = device.createTexture({\n label: \"plasius.wavefront.radiance\",\n size: { width: config.width, height: config.height },\n format: \"rgba16float\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING,\n });\n const radianceView = radianceTexture.createView();\n const denoiseScratchTexture = device.createTexture({\n label: \"plasius.wavefront.denoiseScratch\",\n size: { width: config.width, height: config.height },\n format: \"rgba16float\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING,\n });\n const denoiseScratchView = denoiseScratchTexture.createView();\n const outputTexture = device.createTexture({\n label: \"plasius.wavefront.output\",\n size: { width: config.width, height: config.height },\n format: \"rgba8unorm\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING |\n constants.texture.COPY_SRC,\n });\n const outputView = outputTexture.createView();\n const sampler = device.createSampler({\n label: \"plasius.wavefront.presentSampler\",\n magFilter: \"nearest\",\n minFilter: \"nearest\",\n });\n const environmentMapResource = createEnvironmentMapResource(\n device,\n constants,\n config.environmentMap,\n config.environmentColor\n );\n const environmentSamplingResource = createEnvironmentSamplingTextureResource(\n device,\n constants,\n config.environmentMap,\n config.environmentColor\n );\n let mediumTextureResource = createMediumTextureResource(\n device,\n constants,\n config.mediums\n );\n config = Object.freeze({\n ...config,\n environmentMap: Object.freeze({\n ...config.environmentMap,\n width: environmentMapResource.width,\n height: environmentMapResource.height,\n mipLevelCount: environmentMapResource.mipLevelCount,\n hasImportanceData: environmentSamplingResource.hasImportanceData,\n }),\n });\n const brdfLutResource = createBrdfLutResource(device, constants);\n const baseColorAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.baseColorAtlas,\n \"plasius.wavefront.materialAtlas.baseColor\"\n );\n const metallicRoughnessAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.metallicRoughnessAtlas,\n \"plasius.wavefront.materialAtlas.metallicRoughness\"\n );\n const normalAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.normalAtlas,\n \"plasius.wavefront.materialAtlas.normal\"\n );\n const occlusionAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.occlusionAtlas,\n \"plasius.wavefront.materialAtlas.occlusion\"\n );\n const emissiveAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.emissiveAtlas,\n \"plasius.wavefront.materialAtlas.emissive\"\n );\n const extensionAtlasNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n const extensionAtlasResources = Object.freeze(\n Object.fromEntries(\n extensionAtlasNames.map((name) => [\n name,\n createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.extensionAtlases[name],\n `plasius.wavefront.materialAtlas.${name}`\n ),\n ])\n )\n );\n const materialAtlasSampler = device.createSampler({\n label: \"plasius.wavefront.materialAtlasSampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n });\n\n const {\n bindGroupLayouts: {\n trace: traceBindGroupLayout,\n acceleration: accelerationBindGroupLayout,\n denoiseRadiance: denoiseRadianceBindGroupLayout,\n denoiseResolve: denoiseResolveBindGroupLayout,\n present: presentBindGroupLayout,\n },\n computePipelines: pipelines,\n presentPipeline,\n } = await createWavefrontPipelineResources({ device, constants, format });\n\n function createTraceBindGroups() {\n return createWavefrontTraceBindGroups({\n device,\n traceBindGroupLayout,\n activeQueue,\n nextQueue,\n frameConfigBuffer: configBuffer,\n hitBuffer,\n accumulationBuffer,\n sceneObjectBuffer,\n counterBuffer,\n outputView,\n triangleBuffer,\n bvhNodeBuffer,\n radianceView,\n environmentPortalBuffer,\n environmentMapResource,\n pathVertexBuffer,\n baseColorAtlasResource,\n metallicRoughnessAtlasResource,\n normalAtlasResource,\n occlusionAtlasResource,\n emissiveAtlasResource,\n materialAtlasSampler,\n brdfLutResource,\n environmentSamplingResource,\n mediumTextureResource,\n extensionAtlasResources,\n });\n }\n\n let bindGroups = createTraceBindGroups();\n const bvhBuildBindGroup = createWavefrontBvhBuildBindGroup({\n device,\n accelerationBindGroupLayout,\n bvhBuildConfigBuffer,\n triangleBuffer,\n bvhNodeBuffer,\n meshVertexBuffer,\n meshIndexBuffer,\n meshRangeBuffer,\n bvhLeafRefBuffer,\n });\n const {\n radiance: denoiseRadianceBindGroup,\n resolve: denoiseResolveBindGroup,\n directResolve: denoiseDirectResolveBindGroup,\n } = createWavefrontDenoiseBindGroups({\n device,\n denoiseRadianceBindGroupLayout,\n denoiseResolveBindGroupLayout,\n configBuffer,\n radianceView,\n denoiseScratchView,\n outputView,\n });\n const presentBindGroup = createWavefrontPresentBindGroup({\n device,\n presentBindGroupLayout,\n outputView,\n sampler,\n });\n let activeFrameTelemetry = null;\n let frameTelemetryResources = null;\n const frameEncoder = createWavefrontFrameEncoder({\n getConfig: () => config,\n getBindGroups: () => bindGroups,\n pipelines,\n counterBuffer,\n activeDispatchBuffer,\n denoiseRadianceBindGroup,\n denoiseResolveBindGroup,\n denoiseDirectResolveBindGroup,\n presentPipeline,\n presentBindGroup,\n context,\n getFrameTelemetry: () => activeFrameTelemetry,\n });\n\n let frame = 0;\n let accelerationBuilt = !config.gpuAccelerationBuildRequired;\n let accelerationBuildCount = 0;\n let activeCameraOptions = options.camera ?? DEFAULT_CAMERA;\n let lastCompletedFrameTimeMs = null;\n let lastCompletedSamplesPerPixel = Math.max(1, config.samplesPerPixel);\n let lastGpuParallelism = createGpuParallelismDiagnostics(\n gpuAdapterParallelism,\n createGpuParallelismCounters()\n );\n const waitForSubmittedGpuWork = (waitOptions = {}) =>\n waitForSubmittedGpuWorkForDevice(device, waitOptions);\n\n function ensureFrameTelemetryResources() {\n if (!frameTelemetryResources) {\n frameTelemetryResources = createWavefrontFrameTelemetryResources({\n device,\n constants,\n maxRayCountRecords:\n tiles.length * config.samplesPerPixel * config.maxDepth,\n });\n }\n return frameTelemetryResources;\n }\n\n function resolveRenderedSamplesPerPixel(renderOptions = {}, awaitGPUCompletion = true) {\n return resolveWavefrontRenderedSamplesPerPixel({\n config,\n renderOptions,\n awaitGPUCompletion,\n lastCompletedFrameTimeMs,\n lastCompletedSamplesPerPixel,\n });\n }\n\n function createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n }) {\n const stats = createWavefrontFrameStats({\n config,\n tiles,\n frame,\n frameIndex,\n accelerationBuilt,\n accelerationBuildCount,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n frameConfigSlotCount,\n gpuAdapterParallelism,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n });\n lastGpuParallelism = stats.gpuParallelism;\n return stats.frameStats;\n }\n\n async function readTerminationMetrics() {\n return readWavefrontTerminationMetrics({\n device,\n constants,\n counterBuffer,\n waitForSubmittedGpuWork,\n });\n }\n\n function writeFrameConfigSlot(slot, tile, frameIndex, buildRange = {}) {\n if (slot >= frameConfigSlotCount) {\n throw new Error(\"Wavefront frame config slot capacity exceeded.\");\n }\n const offset = slot * configBufferStride;\n device.queue.writeBuffer(\n configBuffer,\n offset,\n createConfigPayload(config, tile, frameIndex, buildRange)\n );\n return offset;\n }\n\n function createFrameConfigWriter(frameIndex) {\n let slot = 0;\n return (tile, buildRange = {}) => {\n const offset = writeFrameConfigSlot(slot, tile, frameIndex, buildRange);\n slot += 1;\n return offset;\n };\n }\n\n function dispatchGpuAccelerationBuild(frameIndex, parallelism) {\n const submitted = dispatchWavefrontGpuAccelerationBuild({\n config,\n accelerationBuilt,\n tiles,\n device,\n bvhBuildConfigBuffer,\n configBufferStride,\n bvhBuildBindGroup,\n pipelines,\n parallelism,\n frameIndex,\n });\n if (submitted) {\n accelerationBuilt = true;\n accelerationBuildCount += 1;\n }\n return submitted;\n }\n\n function dispatchFrame(frameIndex, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\n return dispatchWavefrontFrame({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel,\n frameEncoder,\n createFrameConfigWriter,\n });\n }\n\n function renderOnce(renderOptions = {}, resolvedSamplingPlan = null) {\n const frameStartTimeMs = nowMs();\n frame += 1;\n const frameIndex = frame + config.frameIndex;\n const samplingPlan = resolvedSamplingPlan ?? resolveRenderedSamplesPerPixel(renderOptions, false);\n const parallelismCounters = createGpuParallelismCounters();\n const accelerationBuildSubmitted = dispatchGpuAccelerationBuild(frameIndex, parallelismCounters);\n const frameSubmissionCount = dispatchFrame(\n frameIndex,\n parallelismCounters,\n samplingPlan.renderedSamplesPerPixel\n );\n const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n return Object.freeze({\n ...createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel,\n targetSamplesPerPixel: samplingPlan.targetSamplesPerPixel,\n frameTimeBudgetMs: samplingPlan.frameTimeBudgetMs,\n budgetConstrained: samplingPlan.budgetConstrained,\n }),\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n lastGpuParallelism,\n frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0),\n frameTimeMs,\n false\n ),\n timings: createWavefrontFrameTimingTelemetry({\n status: \"not-requested\",\n source: \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n }),\n });\n }\n\n function dispatchFrameAwaitingGpu(\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n optionsForFrame = {}\n ) {\n return dispatchWavefrontFrameAwaitingGpu({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel,\n frameEncoder,\n writeFrameConfigSlot,\n optionsForFrame,\n });\n }\n\n async function readOutputProbe(optionsForProbe = {}) {\n return readWavefrontOutputProbe({\n device,\n constants,\n config,\n outputTexture,\n waitForSubmittedGpuWork,\n optionsForProbe,\n });\n }\n\n async function renderFrame(renderOptions = {}) {\n const awaitGPUCompletion = renderOptions.awaitGPUCompletion !== false;\n const samplingPlan = resolveRenderedSamplesPerPixel(renderOptions, awaitGPUCompletion);\n const useThrottledHighSamplePath =\n awaitGPUCompletion && samplingPlan.renderedSamplesPerPixel >= 8;\n const telemetryRequested = renderOptions.readStats === true;\n const telemetryCanRecord = telemetryRequested && awaitGPUCompletion;\n const telemetryResourcesForFrame = telemetryCanRecord\n ? ensureFrameTelemetryResources()\n : null;\n if (telemetryResourcesForFrame?.available) {\n telemetryResourcesForFrame.beginFrame();\n activeFrameTelemetry = telemetryResourcesForFrame;\n }\n const frameStartTimeMs = nowMs();\n let frameStats;\n try {\n if (useThrottledHighSamplePath) {\n frame += 1;\n const frameIndex = frame + config.frameIndex;\n const parallelismCounters = createGpuParallelismCounters();\n const accelerationBuildSubmitted = dispatchGpuAccelerationBuild(frameIndex, parallelismCounters);\n let frameSubmissionCount = 0;\n let frameConfigSlot = 0;\n if (accelerationBuildSubmitted) {\n const accelerationWaitOptions = {\n ...estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: 1 },\n 1,\n renderOptions.submittedWorkTimeoutMs,\n { includeAccelerationBuild: true }\n ),\n allowTimeout: false,\n };\n await waitForSubmittedGpuWork(accelerationWaitOptions);\n }\n for (let tileIndex = 0; tileIndex < tiles.length; tileIndex += 1) {\n const tileRangeDispatch = dispatchFrameAwaitingGpu(\n frameIndex,\n parallelismCounters,\n samplingPlan.renderedSamplesPerPixel,\n {\n sampleRangeStart: 0,\n sampleRangeEnd: samplingPlan.renderedSamplesPerPixel,\n tileStartIndex: tileIndex,\n tileEndIndex: tileIndex + 1,\n startingSubmissionCount: frameSubmissionCount,\n startingSlot: frameConfigSlot,\n includeDenoise: tileIndex + 1 >= tiles.length,\n includePresent: tileIndex + 1 >= tiles.length,\n }\n );\n frameSubmissionCount = tileRangeDispatch.submissionCount;\n frameConfigSlot = tileRangeDispatch.slot;\n const tileWaitOptions = {\n ...estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel },\n 1,\n renderOptions.submittedWorkTimeoutMs,\n {\n includeDenoise: tileIndex + 1 >= tiles.length && config.denoise,\n includePresent: tileIndex + 1 >= tiles.length,\n }\n ),\n allowTimeout: false,\n };\n await waitForSubmittedGpuWork(tileWaitOptions);\n }\n frameStats = createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel,\n targetSamplesPerPixel: samplingPlan.targetSamplesPerPixel,\n frameTimeBudgetMs: samplingPlan.frameTimeBudgetMs,\n budgetConstrained: samplingPlan.budgetConstrained,\n });\n } else {\n const submittedWorkTiming = estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel },\n tiles.length,\n renderOptions.submittedWorkTimeoutMs,\n { includeAccelerationBuild: config.gpuAccelerationBuildRequired && !accelerationBuilt }\n );\n const submissionWaitOptions = awaitGPUCompletion\n ? {\n timeoutMs: submittedWorkTiming.timeoutMs,\n maxWaitMs: submittedWorkTiming.maxWaitMs,\n allowTimeout: false,\n }\n : {\n timeoutMs: submittedWorkTiming.timeoutMs,\n maxWaitMs: submittedWorkTiming.maxWaitMs,\n };\n frameStats = renderOnce(renderOptions, samplingPlan);\n if (awaitGPUCompletion) {\n await waitForSubmittedGpuWork(submissionWaitOptions);\n }\n }\n } finally {\n activeFrameTelemetry = null;\n }\n const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n if (awaitGPUCompletion) {\n lastCompletedFrameTimeMs = frameTimeMs;\n lastCompletedSamplesPerPixel = frameStats.renderedSamplesPerPixel ?? frameStats.samplesPerPixel;\n }\n const expectedPrimaryRays =\n config.width * config.height * samplingPlan.renderedSamplesPerPixel;\n const expectedRayCounts =\n tiles.length * samplingPlan.renderedSamplesPerPixel * config.maxDepth;\n const telemetryReadback = telemetryCanRecord\n ? await telemetryResourcesForFrame.readFrame({\n expectedPrimaryRays,\n expectedRayCounts,\n waitForSubmittedGpuWork,\n })\n : null;\n const rayCounts = !telemetryRequested\n ? createWavefrontRayCountTelemetry()\n : !awaitGPUCompletion\n ? createWavefrontRayCountTelemetry({\n status: \"unavailable\",\n expectedPrimaryRays,\n expectedRayCounts,\n reason: \"gpu-work-not-awaited\",\n })\n : telemetryReadback.rayCounts;\n const timings = !telemetryRequested\n ? createWavefrontFrameTimingTelemetry({\n status: \"not-requested\",\n source: awaitGPUCompletion ? \"queue-completion\" : \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n })\n : !awaitGPUCompletion\n ? createWavefrontFrameTimingTelemetry({\n status: \"unavailable\",\n source: \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n reason: \"gpu-work-not-awaited\",\n })\n : telemetryReadback.timestampQueryStatus === \"available\"\n ? createWavefrontFrameTimingTelemetry({\n status: \"available\",\n source: \"timestamp-query\",\n timestampQueryStatus: \"available\",\n totalGpuTimeMs: telemetryReadback.totalGpuTimeMs,\n totalRenderJobTimeMs: frameTimeMs,\n })\n : createWavefrontFrameTimingTelemetry({\n status: \"fallback\",\n source: \"queue-completion\",\n timestampQueryStatus: telemetryReadback.timestampQueryStatus,\n totalRenderJobTimeMs: frameTimeMs,\n reason: telemetryReadback.reason,\n });\n const deviceLossStatus =\n awaitGPUCompletion\n ? \"not-detected\"\n : typeof device.lost?.then === \"function\"\n ? \"pending\"\n : \"not-exposed\";\n frameStats = Object.freeze({\n ...frameStats,\n deviceLossStatus,\n secondaryRays:\n rayCounts.status === \"available\" ? rayCounts.secondaryRays : null,\n totalPathSegments:\n rayCounts.status === \"available\" ? rayCounts.totalPathSegments : null,\n rayCounts,\n timings,\n telemetryMemoryBytes: telemetryResourcesForFrame?.memoryBytes ?? 0,\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n frameStats.gpuParallelism,\n frameStats.commandSubmissions,\n frameTimeMs,\n awaitGPUCompletion\n ),\n });\n const terminationMetrics = awaitGPUCompletion && renderOptions.readStats === true\n ? await readTerminationMetrics()\n : EMPTY_TERMINATION_METRICS;\n const probe =\n renderOptions.readOutputProbe === false ? null : await readOutputProbe(renderOptions.probe);\n const maxChannel = probe ? Math.max(...probe.rgba.slice(0, 3)) : 0;\n const completedFrame = Object.freeze({\n ...frameStats,\n outputProbe: probe\n ? Object.freeze({\n ...probe,\n sampledPixels: 1,\n nonZeroSamples: maxChannel > 0 ? 1 : 0,\n maxChannel,\n })\n : null,\n bounces: [],\n termination: terminationMetrics.termination,\n terminalRadiance: terminationMetrics.terminalRadiance,\n radianceDiagnostics: terminationMetrics.radianceDiagnostics,\n transportContributions: terminationMetrics.transportContributions,\n queueOverflow: terminationMetrics.queueOverflow,\n });\n return Object.freeze({\n ...completedFrame,\n transportGuardrails: createWavefrontTransportGuardrailSummary(completedFrame),\n });\n }\n\n function rebuildLiveConfig(overrides = {}) {\n return createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n sceneObjectCapacity: config.sceneObjectCapacity,\n sceneObjects: packedScene.objects,\n camera: activeCameraOptions,\n environmentMap: {\n ...config.environmentMap,\n },\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n featureFlags: options.featureFlags,\n frameIndex: config.frameIndex,\n ...overrides,\n });\n }\n\n function rebuildMediumResources(nextConfig) {\n const previousMediumTextureResource = mediumTextureResource;\n mediumTextureResource = createMediumTextureResource(device, constants, nextConfig.mediums);\n bindGroups = createTraceBindGroups();\n if (previousMediumTextureResource?.ownsTexture) {\n previousMediumTextureResource.texture?.destroy?.();\n }\n }\n\n function updateSceneObjects(sceneObjects) {\n const nextPackedScene = packWavefrontSceneObjects(sceneObjects, config.sceneObjectCapacity);\n packedScene = nextPackedScene;\n const nextConfig = rebuildLiveConfig();\n if (!mediumTablesEqual(config.mediums, nextConfig.mediums)) {\n rebuildMediumResources(nextConfig);\n }\n config = nextConfig;\n device.queue.writeBuffer(sceneObjectBuffer, 0, packedScene.buffer);\n return config;\n }\n\n function updateCamera(cameraOptions = {}) {\n activeCameraOptions = cameraOptions;\n config = rebuildLiveConfig();\n return config;\n }\n\n function getSnapshot() {\n return Object.freeze({\n frame,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tiles: tiles.length,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n sceneObjectCount: config.sceneObjectCount,\n triangleCount: config.triangleCount,\n emissiveTriangleCount: config.emissiveTriangleCount,\n environmentPortalCount: config.environmentPortalCount,\n environmentPortalMode: config.environmentPortalMode,\n mediumCount: config.mediumCount,\n environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n transportExperiments: config.transportExperiments,\n transportExperimentFlags: config.transportExperimentFlags,\n bvhNodeCount: config.bvhNodeCount,\n displayQuality: config.displayQuality,\n accelerationBuildMode: config.accelerationBuildMode,\n gpuAccelerationBuildRequired: config.gpuAccelerationBuildRequired,\n accelerationBuilt,\n accelerationBuildCount,\n frameConfigSlots: frameConfigSlotCount,\n gpuParallelism: lastGpuParallelism,\n memory: config.memory,\n });\n }\n\n function destroy() {\n frameTelemetryResources?.destroy?.();\n activeQueue.destroy?.();\n nextQueue.destroy?.();\n hitBuffer.destroy?.();\n accumulationBuffer.destroy?.();\n pathVertexBuffer.destroy?.();\n sceneObjectBuffer.destroy?.();\n triangleBuffer.destroy?.();\n bvhNodeBuffer.destroy?.();\n meshVertexBuffer.destroy?.();\n meshIndexBuffer.destroy?.();\n meshRangeBuffer.destroy?.();\n environmentPortalBuffer.destroy?.();\n bvhLeafRefBuffer.destroy?.();\n configBuffer.destroy?.();\n bvhBuildConfigBuffer.destroy?.();\n counterBuffer.destroy?.();\n activeDispatchBuffer.destroy?.();\n radianceTexture.destroy?.();\n denoiseScratchTexture.destroy?.();\n outputTexture.destroy?.();\n if (environmentMapResource.ownsTexture) {\n environmentMapResource.texture?.destroy?.();\n }\n if (environmentSamplingResource.ownsTexture) {\n environmentSamplingResource.texture?.destroy?.();\n }\n if (mediumTextureResource.ownsTexture) {\n mediumTextureResource.texture?.destroy?.();\n }\n brdfLutResource.texture?.destroy?.();\n if (baseColorAtlasResource.ownsTexture) {\n baseColorAtlasResource.texture?.destroy?.();\n }\n if (metallicRoughnessAtlasResource.ownsTexture) {\n metallicRoughnessAtlasResource.texture?.destroy?.();\n }\n if (normalAtlasResource.ownsTexture) {\n normalAtlasResource.texture?.destroy?.();\n }\n if (occlusionAtlasResource.ownsTexture) {\n occlusionAtlasResource.texture?.destroy?.();\n }\n if (emissiveAtlasResource.ownsTexture) {\n emissiveAtlasResource.texture?.destroy?.();\n }\n Object.values(extensionAtlasResources).forEach((resource) => {\n if (resource.ownsTexture) {\n resource.texture?.destroy?.();\n }\n });\n context.unconfigure?.();\n }\n\n return Object.freeze({\n canvas,\n context,\n device,\n format,\n config,\n renderOnce,\n renderFrame,\n readOutputProbe,\n updateSceneObjects,\n updateCamera,\n getSnapshot,\n destroy,\n });\n}\n\nexport async function renderWavefrontPathTracingComputeFrame(options = {}) {\n const renderer = await createWavefrontPathTracingComputeRenderer(options);\n try {\n return await renderer.renderFrame(options);\n } finally {\n renderer.destroy();\n }\n}\n\nexport { createWavefrontPathTracingComputeShaderSource } from \"./wavefront-shaders.js\";\nexport {\n computeWavefrontTerminalEnvironmentContributionReference,\n createWavefrontReferenceRay,\n estimateWavefrontDirectionalHemisphericalReflectance,\n intersectWavefrontReferenceTriangle,\n traceWavefrontReferenceTriangles,\n validateWavefrontBsdfSample,\n} from \"./wavefront-reference.js\";\nexport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n normalizeWavefrontMesh,\n normalizeWavefrontSceneObject,\n} from \"./wavefront-scene-data.js\";\nexport {\n createWavefrontPathTracingComputeConfig,\n estimateWavefrontPathTracingMemory,\n supportsWavefrontPathTracingCompute,\n} from \"./wavefront-config.js\";\nexport {\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n} from \"./wavefront-packers.js\";\nexport {\n rendererWavefrontComputeMode,\n rendererWavefrontComputeStatsStride,\n rendererWavefrontComputeWorkgroupSize,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-core.js\";\n","import {\n rendererDebugOwner,\n rendererWavefrontBufferSchemaVersion,\n rendererWavefrontHitTypes,\n rendererWavefrontPassOrder,\n rendererWavefrontQueuePairStrategy,\n} from \"./renderer-constants.js\";\nimport { readNonNegativeInteger, readPositiveInteger } from \"./renderer-validation.js\";\n\nfunction clampWavefrontAdaptiveSamplesPerPixel(value) {\n if (!Number.isFinite(value)) {\n return 1;\n }\n return Math.max(1, Math.min(256, Math.round(value)));\n}\n\nexport function createWavefrontAdaptiveSamplingLevels(options = {}) {\n const requestedSamplesPerPixel = clampWavefrontAdaptiveSamplesPerPixel(\n options.samplesPerPixel ?? 1\n );\n const minimumSamplesPerPixel = Math.min(\n requestedSamplesPerPixel,\n clampWavefrontAdaptiveSamplesPerPixel(options.minimumSamplesPerPixel ?? 1)\n );\n const frameTimeBudgetMs = Number.isFinite(options.frameTimeBudgetMs)\n ? Math.max(0, Number(options.frameTimeBudgetMs))\n : 0;\n const levels = new Set([minimumSamplesPerPixel, requestedSamplesPerPixel]);\n let currentSamplesPerPixel = minimumSamplesPerPixel;\n\n while (currentSamplesPerPixel < requestedSamplesPerPixel) {\n levels.add(currentSamplesPerPixel);\n currentSamplesPerPixel *= 2;\n }\n\n levels.add(Math.min(currentSamplesPerPixel, requestedSamplesPerPixel));\n\n return Object.freeze({\n requestedSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n levels: Object.freeze(\n [...levels]\n .sort((left, right) => left - right)\n .map((samplesPerPixel) =>\n Object.freeze({\n id: `${samplesPerPixel}spp`,\n label: `${samplesPerPixel} spp`,\n estimatedCostMs: samplesPerPixel,\n config: Object.freeze({\n samplesPerPixel,\n frameTimeBudgetMs,\n minimumSamplesPerPixel,\n }),\n })\n )\n ),\n });\n}\n\nfunction createWavefrontField(name, type, description) {\n return Object.freeze({\n name,\n type,\n description,\n });\n}\n\nconst rendererWavefrontBufferContracts = Object.freeze({\n ray: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"RayRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Stable ray identifier for correlation and debugging.\"),\n createWavefrontField(\"parentRayId\", \"u32\", \"Parent ray identifier for continuation lineage.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel that owns the sample.\"),\n createWavefrontField(\"sampleId\", \"u32\", \"Per-pixel sample slot for accumulation.\"),\n createWavefrontField(\"bounce\", \"u32\", \"Breadth-first bounce depth for the queue entry.\"),\n createWavefrontField(\"origin\", \"vec3<f32>\", \"Ray origin in renderer world space.\"),\n createWavefrontField(\"direction\", \"vec3<f32>\", \"Normalized ray direction in renderer world space.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Current physical path throughput before the next event.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Active medium reference identifier for the ray.\"),\n createWavefrontField(\"flags\", \"u32\", \"Bit flags for front-face state, debug, and quality toggles.\"),\n ]),\n }),\n hit: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"HitRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier copied from the active queue.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Pixel/texel owner for the ray sample.\"),\n createWavefrontField(\"hitType\", rendererWavefrontHitTypes.join(\" | \"), \"Resolved hit classification for termination or continuation.\"),\n createWavefrontField(\"distance\", \"f32\", \"Nearest-hit distance or miss sentinel.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"instanceId\", \"u32\", \"Renderer instance identifier.\"),\n createWavefrontField(\"primitiveId\", \"u32\", \"Primitive or triangle identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Surface material identifier.\"),\n createWavefrontField(\"barycentrics\", \"vec3<f32>\", \"Triangle barycentric coordinates for interpolation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved surface UV when available.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"True geometric face normal.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Interpolated or repaired shading normal.\"),\n createWavefrontField(\"frontFace\", \"bool\", \"Front-face classification for shading and medium transitions.\"),\n ]),\n }),\n surface: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"SurfaceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier matched to the resolved hit.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"materialRefId\", \"u32\", \"Material-reference indirection for shading lookup tables.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Resolved medium transition/reference identifier.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"Preserved geometric normal for hemisphere checks.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Normal used for BSDF/BTDF evaluation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved texture coordinate.\"),\n createWavefrontField(\"tangentFrame\", \"mat3x3<f32>\", \"Optional tangent basis for normal-map transforms.\"),\n ]),\n }),\n materialReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MaterialReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"materialRefId\", \"u32\", \"Stable material lookup identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Authoritative material id from scene submission.\"),\n createWavefrontField(\"shadingModel\", \"u32\", \"Renderer-owned shading model enum.\"),\n createWavefrontField(\"textureSetId\", \"u32\", \"Texture indirection set for the material.\"),\n createWavefrontField(\"flags\", \"u32\", \"Alpha, emissive, transmission, and debug flags.\"),\n ]),\n }),\n mediumReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MediumReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"mediumRefId\", \"u32\", \"Stable medium lookup identifier.\"),\n createWavefrontField(\"mediumId\", \"u32\", \"Authoritative medium or fluid descriptor id.\"),\n createWavefrontField(\"phaseModel\", \"u32\", \"Medium phase-function selector.\"),\n createWavefrontField(\"absorption\", \"vec3<f32>\", \"Absorption coefficients for the active medium.\"),\n createWavefrontField(\"scattering\", \"vec3<f32>\", \"Scattering coefficients for the active medium.\"),\n ]),\n }),\n accumulation: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"AccumulationRecord\",\n fields: Object.freeze([\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel accumulator owner.\"),\n createWavefrontField(\"sampleCount\", \"u32\", \"Committed sample count for the pixel.\"),\n createWavefrontField(\"radiance\", \"vec3<f32>\", \"Accumulated radiance before tone-map/output resolve.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Last surviving physical throughput for debug and variance tracking.\"),\n createWavefrontField(\"resetEpoch\", \"u32\", \"Accumulation reset generation for history invalidation.\"),\n ]),\n }),\n});\n\nfunction buildWavefrontTerminationPolicy() {\n return Object.freeze({\n terminalHitTypes: Object.freeze([\"emissive\", \"environment\", \"miss\"]),\n continuationHitTypes: Object.freeze([\"surface\", \"transparent\"]),\n emissive: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n environment: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n miss: Object.freeze({\n action: \"accumulate-environment-or-dark-stop\",\n contributesRadiance: true,\n }),\n });\n}\n\nfunction buildWavefrontBounceSchedule(maxDepth) {\n return Object.freeze(\n Array.from({ length: maxDepth }, (_, index) =>\n Object.freeze({\n bounce: index,\n readQueue: index % 2 === 0 ? \"active\" : \"next\",\n writeQueue: index % 2 === 0 ? \"next\" : \"active\",\n passOrder: rendererWavefrontPassOrder,\n })\n )\n );\n}\n\nexport function createWavefrontPathTracingPlan(options = {}) {\n const maxDepth =\n options.maxDepth === undefined\n ? 6\n : readPositiveInteger(\"maxDepth\", options.maxDepth);\n const queueCapacity =\n options.queueCapacity === undefined\n ? 8192\n : readPositiveInteger(\"queueCapacity\", options.queueCapacity);\n const accumulationResetEpoch =\n options.accumulationResetEpoch === undefined\n ? 0\n : readNonNegativeInteger(\"accumulationResetEpoch\", options.accumulationResetEpoch);\n const explicitLightSampling = options.explicitLightSampling === true;\n\n return Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n owner: rendererDebugOwner,\n maxDepth,\n queueCapacity,\n explicitLightSampling,\n accumulationResetEpoch,\n queueLayout: Object.freeze({\n strategy: rendererWavefrontQueuePairStrategy,\n compactAfterScatter: true,\n queues: Object.freeze([\n Object.freeze({ name: \"active\", role: \"current-bounce\" }),\n Object.freeze({ name: \"next\", role: \"next-bounce\" }),\n ]),\n }),\n bufferContracts: rendererWavefrontBufferContracts,\n bounceSchedule: buildWavefrontBounceSchedule(maxDepth),\n terminationPolicy: buildWavefrontTerminationPolicy(),\n });\n}\n","import { clamp, dot, normalize, scale } from \"./wavefront-core.js\";\n\nexport const MAX_MEDIUM_STACK_DEPTH = 4;\nexport const MAX_TRANSPORT_BRANCHES = 2;\nexport const DEFAULT_SPECTRAL_WAVELENGTHS = Object.freeze([460, 550, 610]);\n\nfunction finite(value, fallback = 0) {\n return Number.isFinite(Number(value)) ? Number(value) : fallback;\n}\n\nfunction vec3(value, fallback = [0, 0, 0]) {\n return [0, 1, 2].map((index) => finite(value?.[index], fallback[index]));\n}\n\nfunction multiply(left, right) {\n return [left[0] * right[0], left[1] * right[1], left[2] * right[2]];\n}\n\nfunction reflectVector(incident, normal) {\n return add(incident, scale(normal, -2 * dot(incident, normal)));\n}\n\nfunction refract(incident, normal, eta) {\n const cosine = Math.min(dot(scale(incident, -1), normal), 1);\n const perpendicular = scale(add(incident, scale(normal, cosine)), eta);\n const parallel = scale(normal, -Math.sqrt(Math.abs(1 - dot(perpendicular, perpendicular))));\n return normalize(add(perpendicular, parallel), reflectVector(incident, normal));\n}\n\nfunction add(left, right) {\n return [left[0] + right[0], left[1] + right[1], left[2] + right[2]];\n}\n\nexport function createMediumStack(value = [], maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const depth = Math.max(1, Math.trunc(finite(maxDepth, MAX_MEDIUM_STACK_DEPTH)));\n const source = Array.isArray(value) ? value : [];\n return Object.freeze(\n source\n .map((mediumId) => Math.max(0, Math.trunc(finite(mediumId, 0))))\n .filter((mediumId) => mediumId > 0)\n .slice(-depth)\n );\n}\n\nexport function currentMediumId(stack) {\n const normalized = createMediumStack(stack);\n return normalized.at(-1) ?? 0;\n}\n\nexport function enterMediumStack(stack, mediumId, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const normalized = createMediumStack(stack, maxDepth);\n const id = Math.max(0, Math.trunc(finite(mediumId, 0)));\n if (id === 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), overflowed: false });\n }\n const depth = Math.max(1, Math.trunc(finite(maxDepth, MAX_MEDIUM_STACK_DEPTH)));\n const next = [...normalized, id];\n const overflowed = next.length > depth;\n const bounded = createMediumStack(next, depth);\n return Object.freeze({ stack: bounded, mediumId: id, overflowed });\n}\n\nexport function exitMediumStack(stack, mediumId, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const normalized = createMediumStack(stack, maxDepth);\n const id = Math.max(0, Math.trunc(finite(mediumId, 0)));\n if (id === 0 || normalized.length === 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), matched: false });\n }\n const index = normalized.lastIndexOf(id);\n if (index < 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), matched: false });\n }\n const next = normalized.slice(0, index).concat(normalized.slice(index + 1));\n return Object.freeze({\n stack: createMediumStack(next, maxDepth),\n mediumId: currentMediumId(next),\n matched: true,\n });\n}\n\nexport function transitionMediumStack(stack, mediumId, frontFace, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n return frontFace ? enterMediumStack(stack, mediumId, maxDepth) : exitMediumStack(stack, mediumId, maxDepth);\n}\n\nexport function beerLambertTransmittance(medium, distance) {\n const travelled = Math.max(0, finite(distance, 0));\n const absorption = vec3(medium?.absorption, [0, 0, 0]).map((value) => Math.max(0, value));\n return Object.freeze(absorption.map((coefficient) => Math.exp(-coefficient * travelled)));\n}\n\nexport function resolveSpectralIor(ior, dispersion = 0, wavelengthNm = 550) {\n const base = clamp(finite(ior, 1.45), 1, 3);\n const spread = clamp(finite(dispersion, 0), 0, 2);\n const wavelength = clamp(finite(wavelengthNm, 550), 380, 780);\n return clamp(base + spread * (550 / wavelength - 1), 1, 3.5);\n}\n\nexport function createSpectralSamples({\n ior = 1.45,\n dispersion = 0,\n wavelengths = DEFAULT_SPECTRAL_WAVELENGTHS,\n} = {}) {\n const source = Array.isArray(wavelengths) && wavelengths.length > 0 ? wavelengths : DEFAULT_SPECTRAL_WAVELENGTHS;\n const weight = 1 / source.length;\n return Object.freeze(\n source.map((wavelength) =>\n Object.freeze({\n wavelengthNm: clamp(finite(wavelength, 550), 380, 780),\n ior: resolveSpectralIor(ior, dispersion, wavelength),\n weight,\n })\n )\n );\n}\n\nfunction fresnel(cosine, etaRatio) {\n const r0 = ((1 - etaRatio) / (1 + etaRatio)) ** 2;\n return clamp(r0 + (1 - r0) * (1 - clamp(cosine, 0, 1)) ** 5, 0, 1);\n}\n\nexport function createTransportBranches({\n incidentDirection = [0, -1, 0],\n normal = [0, 1, 0],\n frontFace = true,\n ior = 1.45,\n dispersion = 0,\n transmission = 1,\n mediumStack = [],\n mediumId = 0,\n maxBranches = MAX_TRANSPORT_BRANCHES,\n wavelengths = DEFAULT_SPECTRAL_WAVELENGTHS,\n} = {}) {\n const incident = normalize(vec3(incidentDirection, [0, -1, 0]), [0, -1, 0]);\n const orientedNormal = normalize(vec3(normal, [0, 1, 0]), [0, 1, 0]);\n const etaRatio = frontFace ? 1 / Math.max(finite(ior, 1.45), 1.0001) : Math.max(finite(ior, 1.45), 1.0001);\n const cosine = clamp(dot(scale(incident, -1), orientedNormal), 0, 1);\n const sinTheta = Math.sqrt(Math.max(0, 1 - cosine * cosine));\n const cannotRefract = etaRatio * sinTheta > 1;\n const reflectWeight = cannotRefract ? 1 : fresnel(cosine, etaRatio);\n const transmitWeight = cannotRefract ? 0 : (1 - reflectWeight) * clamp(finite(transmission, 1), 0, 1);\n const branches = [\n Object.freeze({\n kind: \"reflection\",\n direction: Object.freeze(normalize(reflectVector(incident, orientedNormal), orientedNormal)),\n weight: reflectWeight,\n mediumStack: Object.freeze(createMediumStack(mediumStack)),\n mediumId: currentMediumId(mediumStack),\n wavelengths: createSpectralSamples({ ior, dispersion, wavelengths }),\n }),\n ];\n if (transmitWeight > 0.000001 && branches.length < Math.max(1, Math.trunc(maxBranches))) {\n const transition = transitionMediumStack(mediumStack, mediumId, frontFace);\n branches.push(\n Object.freeze({\n kind: \"transmission\",\n direction: Object.freeze(normalize(refract(incident, orientedNormal, etaRatio), orientedNormal)),\n weight: transmitWeight,\n mediumStack: transition.stack,\n mediumId: transition.mediumId,\n mediumStackOverflowed: transition.overflowed ?? false,\n wavelengths: createSpectralSamples({ ior, dispersion, wavelengths }),\n })\n );\n }\n return Object.freeze(branches.filter((branch) => branch.weight > 0.000001));\n}\n\nexport function applyMediumTransmittance(throughput, medium, distance) {\n return Object.freeze(multiply(vec3(throughput, [1, 1, 1]), beerLambertTransmittance(medium, distance)));\n}\n","import {\n defaultRendererWorkerProfile,\n rendererAccelerationStructureUpdateClasses,\n rendererDebugOwner,\n rendererRayTracingStageOrder,\n rendererRepresentationBands,\n rendererWorkerQueueClass,\n} from \"./renderer-constants.js\";\nimport { assertRendererIdentifier } from \"./renderer-validation.js\";\nimport { createWavefrontPathTracingPlan } from \"./renderer-wavefront-plan.js\";\n\nconst rendererRayTracingStageDefinitions = Object.freeze(\n rendererRayTracingStageOrder.map((key, index) =>\n Object.freeze({\n key,\n order: index + 1,\n required: true,\n description:\n {\n primaryVisibility: \"Primary visibility and depth preparation.\",\n shadowAssist: \"Shadow assist passes and regional shadow preparation.\",\n opaqueFoundation: \"Main opaque foundation for shading and tracing inputs.\",\n rtDirectLighting: \"Ray-traced direct lighting and premium shadows.\",\n rtReflections: \"Ray-traced reflections for important surfaces.\",\n rtGlobalIllumination: \"Selective ray-traced indirect lighting and GI.\",\n denoiseTemporal: \"Required denoise and temporal accumulation stage.\",\n transparents: \"Transparents, particles, and volumetrics composition.\",\n composition: \"Final world composition and color resolve.\",\n present: \"Presentation to the active surface.\",\n }[key],\n })\n )\n);\n\nconst rendererRepresentationBandPolicies = Object.freeze({\n near: Object.freeze({\n band: \"near\",\n rasterMode: \"full-live\",\n rtParticipation: \"premium\",\n shadowSource: \"ray-traced-primary\",\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n }),\n mid: Object.freeze({\n band: \"mid\",\n rasterMode: \"simplified-live\",\n rtParticipation: \"selective\",\n shadowSource: \"regional-raster-and-proxy\",\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n }),\n far: Object.freeze({\n band: \"far\",\n rasterMode: \"proxy-or-cached\",\n rtParticipation: \"proxy\",\n shadowSource: \"merged-proxy-casters\",\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n }),\n horizon: Object.freeze({\n band: \"horizon\",\n rasterMode: \"horizon-shell\",\n rtParticipation: \"disabled\",\n shadowSource: \"baked-impression\",\n temporalReuse: \"cached\",\n updateCadenceDivisor: 60,\n }),\n});\n\nconst rendererAccelerationStructurePolicies = Object.freeze(\n rendererAccelerationStructureUpdateClasses.map((updateClass) =>\n Object.freeze({\n updateClass,\n description:\n {\n static: \"Stable static world geometry with infrequent rebuilds.\",\n \"rigid-dynamic\":\n \"Rigid transforms that can be refit or relinked without full deformation updates.\",\n deforming:\n \"Skinned or vertex-deforming content treated as a managed RT cost center.\",\n proxy:\n \"Low-cost RT proxy or distant representation updates.\",\n }[updateClass],\n })\n )\n);\n\nfunction buildRendererWorkerBudgetLevels(jobType, queueClass, levels) {\n return Object.freeze(\n levels.map((level) =>\n Object.freeze({\n id: level.id,\n estimatedCostMs: level.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: level.config.maxDispatchesPerFrame,\n maxJobsPerDispatch: level.config.maxJobsPerDispatch,\n cadenceDivisor: level.config.cadenceDivisor,\n workgroupScale: level.config.workgroupScale,\n maxQueueDepth: level.config.maxQueueDepth,\n metadata: Object.freeze({\n owner: rendererDebugOwner,\n queueClass,\n jobType,\n quality: level.id,\n }),\n }),\n })\n )\n );\n}\n\nconst rendererWorkerProfileSpecs = {\n realtime: {\n description:\n \"Frame-stage DAG for flat rendering with visibility, main encode, post-processing, and submit.\",\n suggestedAllocationIds: [\n \"renderer.surface.current\",\n \"renderer.visibility.worklist\",\n \"renderer.post-process.history\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.4,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 512,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.visibility.worklist\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"acquire\", \"visibility\"],\n domain: \"geometry\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 2.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 3,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n postProcess: {\n priority: 3,\n dependencies: [\"mainEncode\"],\n domain: \"post-processing\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.4,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.post-process.history\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"postProcess\"],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n },\n },\n xr: {\n description:\n \"Frame-stage DAG for XR rendering with late-latch coordination before main encode and submit.\",\n suggestedAllocationIds: [\n \"renderer.xr.surface.current\",\n \"renderer.xr.visibility.worklist\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.3,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.visibility.worklist\"],\n },\n lateLatch: {\n priority: 5,\n dependencies: [\"acquire\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.15,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"visibility\", \"lateLatch\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 1.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 2.6,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"mainEncode\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n },\n },\n};\n\nfunction buildRendererInputBoundary(profile) {\n return Object.freeze({\n type: \"stable-visual-snapshot\",\n owner: rendererDebugOwner,\n profile,\n authority: \"visual\",\n source: \"scene-preparation\",\n stable: true,\n });\n}\n\nfunction buildRendererRenderStages(profile) {\n return Object.freeze(\n rendererRayTracingStageDefinitions.map((stage) =>\n Object.freeze({\n ...stage,\n profile,\n workerJobKeys:\n profile === \"xr\" && stage.key === \"primaryVisibility\"\n ? Object.freeze([\"lateLatch\", \"visibility\"])\n : stage.key === \"present\"\n ? Object.freeze([\"submit\"])\n : stage.key === \"denoiseTemporal\" ||\n stage.key === \"transparents\" ||\n stage.key === \"composition\"\n ? Object.freeze([\"postProcess\"])\n : stage.key === \"primaryVisibility\"\n ? Object.freeze([\"visibility\"])\n : stage.key === \"shadowAssist\" ||\n stage.key === \"opaqueFoundation\" ||\n stage.key === \"rtDirectLighting\" ||\n stage.key === \"rtReflections\" ||\n stage.key === \"rtGlobalIllumination\"\n ? Object.freeze([\"mainEncode\"])\n : Object.freeze([\"mainEncode\"]),\n })\n )\n );\n}\n\nfunction buildRendererRepresentationBands(profile) {\n return Object.freeze(\n rendererRepresentationBands.map((band) =>\n Object.freeze({\n ...rendererRepresentationBandPolicies[band],\n profile,\n })\n )\n );\n}\n\nfunction buildRendererAccelerationStructureUpdates(profile) {\n return Object.freeze(\n rendererAccelerationStructurePolicies.map((policy) =>\n Object.freeze({\n ...policy,\n profile,\n })\n )\n );\n}\n\nfunction buildRendererWorkerProfile(name, spec) {\n return Object.freeze({\n name,\n description: spec.description,\n jobs: Object.freeze(Object.keys(spec.jobs)),\n });\n}\n\nfunction buildRendererWorkerManifestJob(profileName, jobName, spec) {\n const label = `renderer.${profileName}.${jobName}`;\n return Object.freeze({\n key: jobName,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n priority: spec.priority,\n dependencies: Object.freeze(\n spec.dependencies.map((dependency) => `renderer.${profileName}.${dependency}`)\n ),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: buildRendererWorkerBudgetLevels(\n label,\n rendererWorkerQueueClass,\n spec.levels\n ),\n }),\n debug: Object.freeze({\n owner: rendererDebugOwner,\n queueClass: rendererWorkerQueueClass,\n jobType: label,\n tags: Object.freeze([\"renderer\", profileName, jobName, spec.domain]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildRendererWorkerManifest(name, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile: name,\n description: spec.description,\n queueClass: rendererWorkerQueueClass,\n schedulerMode: \"dag\",\n inputBoundary: buildRendererInputBoundary(name),\n renderStages: buildRendererRenderStages(name),\n representationBands: buildRendererRepresentationBands(name),\n accelerationStructureUpdates: buildRendererAccelerationStructureUpdates(name),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([jobName, jobSpec]) =>\n buildRendererWorkerManifestJob(name, jobName, jobSpec)\n )\n ),\n });\n}\n\nexport const rendererWorkerProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerProfile(name, spec),\n ])\n )\n);\n\nexport const rendererWorkerProfileNames = Object.freeze(\n Object.keys(rendererWorkerProfiles)\n);\n\nexport const rendererWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerManifest(name, spec),\n ])\n )\n);\n\nexport function getRendererWorkerProfile(name = defaultRendererWorkerProfile) {\n const profile = rendererWorkerProfiles[name];\n if (!profile) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getRendererWorkerManifest(name = defaultRendererWorkerProfile) {\n const manifest = rendererWorkerManifests[name];\n if (!manifest) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return manifest;\n}\n\nexport function createRayTracingRenderPlan(options = {}) {\n const profile = options.profile ?? defaultRendererWorkerProfile;\n const snapshotId = assertRendererIdentifier(\n \"snapshotId\",\n options.snapshotId\n );\n const workerManifest = getRendererWorkerManifest(profile);\n const representations = Array.isArray(options.representations)\n ? Object.freeze(\n options.representations.map((representation, index) => {\n if (!representation || typeof representation !== \"object\") {\n throw new Error(`representations[${index}] must be an object.`);\n }\n const band = assertRendererIdentifier(\n `representations[${index}].band`,\n representation.band\n );\n if (!rendererRepresentationBands.includes(band)) {\n throw new Error(\n `representations[${index}].band must be one of: ${rendererRepresentationBands.join(\", \")}.`\n );\n }\n return Object.freeze({\n ...representation,\n band,\n });\n })\n )\n : workerManifest.representationBands;\n\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile,\n inputBoundary: Object.freeze({\n ...workerManifest.inputBoundary,\n snapshotId,\n }),\n renderStages: workerManifest.renderStages,\n representationBands: representations,\n accelerationStructureUpdates: workerManifest.accelerationStructureUpdates,\n wavefront: createWavefrontPathTracingPlan(options.wavefront),\n workerManifest,\n });\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAlC,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACZ3B,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAvC,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["scale","texture","pass","module","scale","dot","clamp01","lerp","resolveCanvas","scale","options","nowMs","clamp01","lerp","lerp3","normalize3","durationFromBeats","resolveBeat","movementDistance","key","DEFAULT_CAMERA","readPositiveInteger","readNonNegativeInteger","clamp","clamp","readPositiveInteger","cross","clamp","readNonNegativeInteger","deriveBounds","clamp","readNonNegativeInteger","clamp","cross","readNonNegativeInteger","readNonNegativeInteger","cross","DEFAULT_CAMERA","clamp","readPositiveInteger","cross","fresnel","clamp","resolveCanvas","nowMs","nowMs","waitForSubmittedGpuWork","clamp","readPositiveInteger","clamp","readNonNegativeInteger","readPositiveInteger","radicalInverseVdc","readPositiveInteger","waitForSubmittedGpuWork","clamp","readNonNegativeInteger","clamp","readNonNegativeInteger","readPositiveInteger","cross","cross","resolveCanvas","DEFAULT_CAMERA","waitForSubmittedGpuWork","nowMs","add","clamp"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.js","../src/renderer-constants.js","../src/renderer-validation.js","../src/renderer-webgpu-runtime.js","../src/native-scene-shader.js","../src/native-surface-materials.js","../src/native-scene-renderer.js","../src/canonical-wavefront-meshes.js","../src/animated-scene-renderer.js","../src/animated-gltf-model.js","../src/professional-animated-scene-renderer.js","../src/feedback-diagnostics.js","../src/wavefront-frame-runtime.js","../src/wavefront-workgroup.js","../src/wavefront-core.js","../src/wavefront-binary.js","../src/wavefront-materials.js","../src/wavefront-scene-normalizers.js","../src/wavefront-mesh-sources.js","../src/wavefront-packers.js","../src/wavefront-acceleration-builder.js","../src/wavefront-config.js","../src/wavefront-sampling.js","../src/wavefront-gpu-resources.js","../src/wavefront-bind-groups.js","../src/wavefront-runtime-support.js","../src/wavefront-gpu-synchronization.js","../src/wavefront-frame-telemetry.js","../src/wavefront-frame-stats.js","../src/wavefront-frame-encoder.js","../src/wavefront-frame-dispatcher.js","../src/wavefront-shader-bvh.js","../src/wavefront-shader-kernels.js","../src/wavefront-sampling-dimensions.js","../src/wavefront-shader-layout.js","../src/wavefront-shader-lighting.js","../src/wavefront-shader-materials.js","../src/wavefront-present-shader.js","../src/wavefront-shaders.js","../src/wavefront-pipelines.js","../src/wavefront-readbacks.js","../src/wavefront-reference.js","../src/wavefront-compute.js","../src/renderer-wavefront-plan.js","../src/wavefront-transport.js","../src/renderer-worker-profiles.js"],"sourcesContent":["export { createNativeSceneRenderer } from \"./native-scene-renderer.js\";\nexport { createCanonicalWavefrontMeshInputs } from \"./canonical-wavefront-meshes.js\";\nexport {\n createAnimatedSceneRenderer,\n} from \"./animated-scene-renderer.js\";\nexport {\n createProfessionalAnimatedSceneRenderer,\n} from \"./professional-animated-scene-renderer.js\";\nexport {\n bucketFeedbackGameFrameRate,\n bucketFeedbackGameFrameTime,\n bucketFeedbackGameViewport,\n createFeedbackGameDiagnosticSnapshot,\n} from \"./feedback-diagnostics.js\";\nexport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n createWavefrontPathTracingComputeConfig,\n createWavefrontPathTracingComputeRenderer,\n createWavefrontPathTracingComputeShaderSource,\n createWavefrontReferenceRay,\n estimateWavefrontPathTracingMemory,\n intersectWavefrontReferenceTriangle,\n normalizeWavefrontMesh,\n normalizeWavefrontSceneObject,\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n renderWavefrontPathTracingComputeFrame,\n rendererWavefrontComputeMode,\n rendererWavefrontComputeStatsStride,\n rendererWavefrontComputeWorkgroupSize,\n supportsWavefrontPathTracingCompute,\n traceWavefrontReferenceTriangles,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-compute.js\";\nexport {\n defaultRendererWorkerProfile,\n rendererAccelerationStructureUpdateClasses,\n rendererDebugOwner,\n rendererRayTracingStageOrder,\n rendererRepresentationBands,\n rendererWavefrontBufferSchemaVersion,\n rendererWavefrontHitTypes,\n rendererWavefrontPassOrder,\n rendererWavefrontQueuePairStrategy,\n rendererWorkerQueueClass,\n} from \"./renderer-constants.js\";\nexport {\n createWavefrontAdaptiveSamplingLevels,\n createWavefrontPathTracingPlan,\n} from \"./renderer-wavefront-plan.js\";\nexport {\n applyMediumTransmittance,\n beerLambertTransmittance,\n createMediumStack,\n createSpectralSamples,\n createTransportBranches,\n currentMediumId,\n enterMediumStack,\n exitMediumStack,\n resolveSpectralIor,\n transitionMediumStack,\n MAX_MEDIUM_STACK_DEPTH,\n MAX_TRANSPORT_BRANCHES,\n} from \"./wavefront-transport.js\";\nexport {\n normalizeWavefrontMaterialExtensions,\n} from \"./wavefront-materials.js\";\nexport {\n createRayTracingRenderPlan,\n getRendererWorkerManifest,\n getRendererWorkerProfile,\n rendererWorkerManifests,\n rendererWorkerProfileNames,\n rendererWorkerProfiles,\n} from \"./renderer-worker-profiles.js\";\nexport {\n bindRendererToXrManager,\n createGpuRenderer,\n createRendererDebugHooks,\n defaultRendererClearColor,\n supportsWebGpu,\n} from \"./renderer-webgpu-runtime.js\";\n\nexport { validateNativeMaterials as validateNativeSurfaceMaterials } from './native-surface-materials.js';\n","export const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nexport const DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\nexport const rendererDebugOwner = \"renderer\";\nexport const rendererWorkerQueueClass = \"render\";\nexport const defaultRendererWorkerProfile = \"realtime\";\nexport const rendererRepresentationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\nexport const rendererAccelerationStructureUpdateClasses = Object.freeze([\n \"static\",\n \"rigid-dynamic\",\n \"deforming\",\n \"proxy\",\n]);\nexport const rendererRayTracingStageOrder = Object.freeze([\n \"primaryVisibility\",\n \"shadowAssist\",\n \"opaqueFoundation\",\n \"rtDirectLighting\",\n \"rtReflections\",\n \"rtGlobalIllumination\",\n \"denoiseTemporal\",\n \"transparents\",\n \"composition\",\n \"present\",\n]);\nexport const rendererWavefrontBufferSchemaVersion = 1;\nexport const rendererWavefrontQueuePairStrategy = \"ping-pong-active-next\";\nexport const rendererWavefrontHitTypes = Object.freeze([\n \"surface\",\n \"emissive\",\n \"environment\",\n \"transparent\",\n \"miss\",\n]);\nexport const rendererWavefrontPassOrder = Object.freeze([\n \"generatePrimaryRays\",\n \"intersectActiveQueue\",\n \"resolveSurfaceRecords\",\n \"accumulateTerminalRadiance\",\n \"scatterContinuations\",\n \"compactAndSwapQueues\",\n]);\n","export function readPositiveNumber(name, value) {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n return value;\n}\n\nexport function readPositiveInteger(name, value) {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return value;\n}\n\nexport function readNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer.`);\n }\n return value;\n}\n\nexport function assertRendererIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n return value.trim();\n}\n","import {\n DEFAULT_CANVAS_SELECTOR,\n DEFAULT_CLEAR_COLOR,\n rendererDebugOwner,\n} from \"./renderer-constants.js\";\nimport { readPositiveNumber } from \"./renderer-validation.js\";\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseHexChannel(channel) {\n return parseInt(channel, 16) / 255;\n}\n\nfunction normalizeColor(value) {\n if (Array.isArray(value)) {\n const [r = 0, g = 0, b = 0, a = 1] = value;\n return [clamp01(Number(r) || 0), clamp01(Number(g) || 0), clamp01(Number(b) || 0), clamp01(Number(a) || 0)];\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (/^#[0-9a-f]{3}$/i.test(trimmed)) {\n const r = trimmed[1];\n const g = trimmed[2];\n const b = trimmed[3];\n return [\n parseHexChannel(r + r),\n parseHexChannel(g + g),\n parseHexChannel(b + b),\n 1,\n ];\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\n return [\n parseHexChannel(trimmed.slice(1, 3)),\n parseHexChannel(trimmed.slice(3, 5)),\n parseHexChannel(trimmed.slice(5, 7)),\n 1,\n ];\n }\n }\n\n return [...DEFAULT_CLEAR_COLOR];\n}\n\nfunction now() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction normalizeFrameId(value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(\"frameIdFactory must return a non-empty string.\");\n }\n return value.trim();\n}\n\nfunction resolveTargetFrameTimeMs(options, event) {\n const {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n } = options;\n\n if (typeof getTargetFrameTimeMs === \"function\") {\n const resolved = getTargetFrameTimeMs(event);\n return readPositiveNumber(\"getTargetFrameTimeMs()\", resolved);\n }\n\n if (fixedTargetFrameTimeMs !== undefined) {\n return fixedTargetFrameTimeMs;\n }\n\n if (targetFrameRate !== undefined) {\n return 1000 / targetFrameRate;\n }\n\n return undefined;\n}\n\nexport function createRendererDebugHooks(options = {}) {\n const {\n debugSession,\n targetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n onFrameStart,\n onFrameComplete,\n } = options;\n\n if (!debugSession || typeof debugSession.recordFrame !== \"function\") {\n throw new Error(\n \"debugSession must expose recordFrame(sample). Use @plasius/gpu-debug createGpuDebugSession().\"\n );\n }\n\n const fixedTargetFrameTimeMs = readPositiveNumber(\n \"targetFrameTimeMs\",\n targetFrameTimeMs\n );\n const fixedTargetFrameRate = readPositiveNumber(\n \"targetFrameRate\",\n targetFrameRate\n );\n\n if (\n fixedTargetFrameTimeMs !== undefined &&\n fixedTargetFrameRate !== undefined\n ) {\n throw new Error(\n \"Provide either targetFrameTimeMs or targetFrameRate, not both.\"\n );\n }\n\n if (\n getTargetFrameTimeMs !== undefined &&\n typeof getTargetFrameTimeMs !== \"function\"\n ) {\n throw new Error(\"getTargetFrameTimeMs must be a function when provided.\");\n }\n\n const resolvedOptions = {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate: fixedTargetFrameRate,\n getTargetFrameTimeMs,\n };\n\n return {\n onFrameStart(event) {\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n ...event,\n owner: rendererDebugOwner,\n });\n }\n },\n onFrameComplete(event) {\n const resolvedTargetFrameTimeMs = resolveTargetFrameTimeMs(\n resolvedOptions,\n event\n );\n\n if (\n typeof event.frameTimeMs === \"number\" &&\n Number.isFinite(event.frameTimeMs) &&\n event.frameTimeMs > 0\n ) {\n debugSession.recordFrame({\n frameId: event.frameId,\n frameTimeMs: event.frameTimeMs,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n ...event,\n owner: rendererDebugOwner,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n },\n };\n}\n\nfunction readNavigator(navigatorOverride) {\n const currentNavigator = navigatorOverride ?? globalThis.navigator;\n if (!currentNavigator || typeof currentNavigator !== \"object\") {\n throw new Error(\"Navigator unavailable. Provide a browser-like navigator object.\");\n }\n return currentNavigator;\n}\n\nfunction readDocument(documentOverride) {\n const doc = documentOverride ?? globalThis.document;\n if (!doc || typeof doc !== \"object\") {\n throw new Error(\"Document unavailable. Provide a browser-like document object.\");\n }\n return doc;\n}\n\nfunction resolveCanvas(canvasOrSelector, documentOverride) {\n if (canvasOrSelector && typeof canvasOrSelector === \"object\") {\n return canvasOrSelector;\n }\n\n const doc = readDocument(documentOverride);\n const selector =\n typeof canvasOrSelector === \"string\" && canvasOrSelector.trim().length > 0\n ? canvasOrSelector\n : DEFAULT_CANVAS_SELECTOR;\n const resolved = doc.querySelector(selector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector \"${selector}\".`);\n }\n return resolved;\n}\n\nfunction readGpu(navigatorOverride) {\n const currentNavigator = readNavigator(navigatorOverride);\n const gpu = currentNavigator.gpu;\n if (!gpu || typeof gpu.requestAdapter !== \"function\") {\n throw new Error(\"WebGPU runtime unavailable. navigator.gpu is missing.\");\n }\n return gpu;\n}\n\nfunction configureContext(context, device, format, alphaMode) {\n if (typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n context.configure({\n device,\n format,\n alphaMode,\n });\n}\n\nfunction createRenderPassDescriptor(view, clearColor) {\n return {\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n clearValue: {\n r: clearColor[0],\n g: clearColor[1],\n b: clearColor[2],\n a: clearColor[3],\n },\n storeOp: \"store\",\n },\n ],\n };\n}\n\nexport function supportsWebGpu(options = {}) {\n try {\n const gpu = readGpu(options.navigator);\n return Boolean(gpu);\n } catch {\n return false;\n }\n}\n\nexport async function createGpuRenderer(options = {}) {\n const {\n canvas,\n navigator: navigatorOverride,\n document: documentOverride,\n powerPreference = \"high-performance\",\n alpha = true,\n format,\n clearColor = DEFAULT_CLEAR_COLOR,\n requestAnimationFrame = globalThis.requestAnimationFrame?.bind(globalThis),\n cancelAnimationFrame = globalThis.cancelAnimationFrame?.bind(globalThis),\n frameIdFactory,\n onFrameStart,\n encodeFrame,\n onBeforeEncode,\n onAfterSubmit,\n onFrameComplete,\n } = options;\n\n const gpu = readGpu(navigatorOverride);\n const adapter = await gpu.requestAdapter({ powerPreference });\n if (!adapter) {\n throw new Error(\"Unable to obtain GPU adapter.\");\n }\n\n const device = await adapter.requestDevice();\n const targetCanvas = resolveCanvas(canvas, documentOverride);\n const context = targetCanvas.getContext?.(\"webgpu\");\n if (!context) {\n throw new Error(\"Unable to obtain WebGPU canvas context.\");\n }\n\n const resolvedFormat =\n format ||\n (typeof gpu.getPreferredCanvasFormat === \"function\"\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n configureContext(context, device, resolvedFormat, alpha ? \"premultiplied\" : \"opaque\");\n\n let running = false;\n let destroyed = false;\n let frame = 0;\n let lastTimestamp = 0;\n let rafId = null;\n let clear = normalizeColor(clearColor);\n let xrActive = false;\n let detachXrBinding = null;\n\n const renderOnce = (timestamp = now()) => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n\n const frameNumber = frame + 1;\n const frameId = normalizeFrameId(\n typeof frameIdFactory === \"function\"\n ? frameIdFactory({\n frame: frameNumber,\n timestamp,\n canvas: targetCanvas,\n xrActive,\n })\n : `renderer.frame.${frameNumber}`\n );\n const frameTimeMs =\n lastTimestamp > 0 ? Math.max(0, timestamp - lastTimestamp) : undefined;\n\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n const texture = context.getCurrentTexture?.();\n if (!texture || typeof texture.createView !== \"function\") {\n throw new Error(\"WebGPU context returned an invalid current texture.\");\n }\n\n const encoder = device.createCommandEncoder({\n label: `plasius.gpu-renderer.frame.${frame}`,\n });\n const view = texture.createView();\n\n if (typeof encodeFrame === \"function\") {\n encodeFrame({ device, context, encoder, view, canvas: targetCanvas, timestamp });\n } else {\n const pass = encoder.beginRenderPass(createRenderPassDescriptor(view, clear));\n\n if (typeof onBeforeEncode === \"function\") {\n onBeforeEncode({\n frame,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n encoder,\n pass,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof pass.end === \"function\") {\n pass.end();\n }\n }\n\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n\n frame = frameNumber;\n lastTimestamp = timestamp;\n\n if (typeof onAfterSubmit === \"function\") {\n onAfterSubmit({\n frame: frameNumber,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n return {\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n };\n };\n\n const tick = (timestamp) => {\n if (!running || destroyed) {\n return;\n }\n renderOnce(timestamp);\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const start = () => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n if (running) {\n return false;\n }\n running = true;\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n } else {\n renderOnce();\n }\n return true;\n };\n\n const stop = () => {\n if (!running) {\n return false;\n }\n running = false;\n if (rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(rafId);\n }\n rafId = null;\n return true;\n };\n\n const resize = (cssWidth, cssHeight, devicePixelRatio = globalThis.devicePixelRatio ?? 1) => {\n const width = Math.max(1, Math.floor(cssWidth * devicePixelRatio));\n const height = Math.max(1, Math.floor(cssHeight * devicePixelRatio));\n targetCanvas.width = width;\n targetCanvas.height = height;\n if (targetCanvas.style) {\n targetCanvas.style.width = `${Math.max(1, Math.floor(cssWidth))}px`;\n targetCanvas.style.height = `${Math.max(1, Math.floor(cssHeight))}px`;\n }\n return { width, height };\n };\n\n const setClearColor = (value) => {\n clear = normalizeColor(value);\n return [...clear];\n };\n\n const setXrActive = (active) => {\n xrActive = Boolean(active);\n };\n\n const getSnapshot = () => {\n const width = Number(targetCanvas.width) || 0;\n const height = Number(targetCanvas.height) || 0;\n return {\n running,\n frame,\n lastTimestamp,\n format: resolvedFormat,\n width,\n height,\n xrActive,\n };\n };\n\n const renderer = {\n canvas: targetCanvas,\n context,\n device,\n format: resolvedFormat,\n renderOnce,\n start,\n stop,\n resize,\n setClearColor,\n setXrActive,\n getSnapshot,\n bindXrManager(xrManager, bindOptions = {}) {\n if (detachXrBinding) {\n detachXrBinding();\n }\n detachXrBinding = bindRendererToXrManager(renderer, xrManager, bindOptions);\n return detachXrBinding;\n },\n destroy() {\n stop();\n destroyed = true;\n if (detachXrBinding) {\n detachXrBinding();\n detachXrBinding = null;\n }\n if (typeof context.unconfigure === \"function\") {\n context.unconfigure();\n }\n },\n };\n\n return renderer;\n}\n\nfunction snapshotFromXrManager(xrManager) {\n if (xrManager && typeof xrManager.getState === \"function\") {\n return xrManager.getState();\n }\n if (xrManager?.store && typeof xrManager.store.getSnapshot === \"function\") {\n return xrManager.store.getSnapshot();\n }\n return null;\n}\n\nexport function bindRendererToXrManager(renderer, xrManager, options = {}) {\n if (!xrManager || typeof xrManager.subscribe !== \"function\") {\n throw new Error(\"XR manager must expose subscribe(listener). Use @plasius/gpu-xr createXrManager().\");\n }\n\n const { onSessionStart, onSessionEnd } = options;\n let previousSession = null;\n\n const applyState = (state) => {\n const session = state?.activeSession ?? null;\n if (session === previousSession) {\n return;\n }\n\n previousSession = session;\n\n if (typeof renderer.setXrActive === \"function\") {\n renderer.setXrActive(Boolean(session));\n }\n\n if (session && typeof onSessionStart === \"function\") {\n onSessionStart(session, renderer);\n }\n\n if (!session && typeof onSessionEnd === \"function\") {\n onSessionEnd(renderer);\n }\n };\n\n applyState(snapshotFromXrManager(xrManager));\n return xrManager.subscribe(applyState);\n}\n\nexport const defaultRendererClearColor = DEFAULT_CLEAR_COLOR;\n","// Raster lighting intentionally differs from the wavefront path tracer. It makes\n// no claim of global illumination or ray tracing. All colours remain linear until\n// presentation; the generated harbour materials use continuous world-space detail.\nexport const nativeSceneShader = /* wgsl */ `\nstruct Frame {\n eye: vec4f, right: vec4f, up: vec4f, forward: vec4f,\n settings: vec4f, sun: vec4f,\n lightRight: vec4f, lightUp: vec4f, lightForward: vec4f, lightOrigin: vec4f,\n viewport: vec4f, wakes: array<vec4f, 4>, info: vec4f,\n};\n@group(0) @binding(0) var<uniform> frame: Frame;\n@group(1) @binding(0) var shadowMap: texture_depth_2d;\n@group(1) @binding(1) var shadowSampler: sampler_comparison;\n@group(3) @binding(0) var reflectionMap: texture_2d<f32>;\n@group(3) @binding(1) var reflectionSampler: sampler;\n@group(2) @binding(0) var baseColourMap: texture_2d<f32>;\n@group(2) @binding(1) var normalMap: texture_2d<f32>;\n@group(2) @binding(2) var ormMap: texture_2d<f32>;\n@group(2) @binding(3) var materialSampler: sampler;\n@group(2) @binding(4) var<uniform> materialParameters: vec4f;\n@group(2) @binding(5) var clearcoatMap: texture_2d<f32>;\nstruct Surface {\n @builtin(position) clip: vec4f,\n @location(0) world: vec3f, @location(1) normal: vec3f,\n @location(2) colour: vec3f, @location(3) material: vec3f, @location(4) uv: vec2f,\n};\nfn project(p: vec3f) -> vec4f {\n let d = p - frame.eye.xyz;\n let z = dot(d, frame.forward.xyz);\n return vec4f(dot(d, frame.right.xyz) / (frame.settings.x * frame.settings.y),\n dot(d, frame.up.xyz) / frame.settings.x, (z - 0.08) * 500.0 / 499.92, z);\n}\nfn lightProject(p: vec3f) -> vec4f {\n let d = p - frame.lightOrigin.xyz;\n return vec4f(dot(d, frame.lightRight.xyz) / 34.0,\n dot(d, frame.lightUp.xyz) / 34.0, dot(d, frame.lightForward.xyz) / 100.0, 1.0);\n}\n@vertex fn surfaceVertex(@location(0) p: vec3f, @location(1) n: vec3f,\n @location(2) c: vec3f, @location(3) m: vec3f, @location(4) uv: vec2f) -> Surface {\n return Surface(project(p), p, n, c, m, uv);\n}\n@vertex fn shadowVertex(@location(0) p: vec3f) -> @builtin(position) vec4f {\n return lightProject(p);\n}\n@vertex fn fullscreenVertex(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {\n let positions = array<vec2f, 3>(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3));\n return vec4f(positions[i], 1, 1);\n}\nfn cameraRay(pixel: vec2f) -> vec3f {\n let uv = pixel / frame.viewport.xy * 2.0 - 1.0;\n return normalize(frame.forward.xyz + frame.right.xyz * uv.x * frame.settings.x * frame.settings.y\n - frame.up.xyz * uv.y * frame.settings.x);\n}\nfn display(c: vec3f) -> vec3f {\n let x = max(c * frame.settings.w, vec3f(0));\n let mapped = clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), vec3f(0), vec3f(1));\n return pow(mapped, vec3f(1.0 / 2.2));\n}\nfn hash(p: vec3f) -> f32 { return fract(sin(dot(p, vec3f(127.1, 311.7, 74.7))) * 43758.5453); }\nfn noise(p: vec3f) -> f32 {\n let i = floor(p); let f = fract(p); let u = f * f * (3.0 - 2.0 * f);\n return mix(mix(mix(hash(i), hash(i + vec3f(1,0,0)), u.x),\n mix(hash(i + vec3f(0,1,0)), hash(i + vec3f(1,1,0)), u.x), u.y),\n mix(mix(hash(i + vec3f(0,0,1)), hash(i + vec3f(1,0,1)), u.x),\n mix(hash(i + vec3f(0,1,1)), hash(i + vec3f(1,1,1)), u.x), u.y), u.z);\n}\nfn sky(ray: vec3f) -> vec3f {\n let elevation = pow(clamp(ray.y * 0.7 + 0.16, 0.0, 1.0), 0.6);\n var c = mix(vec3f(0.42, 0.53, 0.61), vec3f(0.07, 0.19, 0.37), elevation);\n let sunAngle = dot(ray, frame.sun.xyz);\n c += vec3f(1.0, 0.73, 0.43) * pow(max(sunAngle, 0.0), 64.0) * 0.35;\n c += vec3f(4.0, 3.2, 2.1) * smoothstep(0.99965, 0.99985, sunAngle);\n let cloudPoint = ray / max(0.12, ray.y) * 2.1 + vec3f(0, 0, 8);\n let cloud = smoothstep(0.49, 0.77, noise(cloudPoint) * 0.65 + noise(cloudPoint * 2.1) * 0.35);\n c = mix(c, vec3f(0.85, 0.86, 0.82), cloud * smoothstep(0.03, 0.35, ray.y) * 0.65);\n return c;\n}\n@fragment fn skyFragment(@builtin(position) pixel: vec4f) -> @location(0) vec4f {\n return vec4f(display(sky(cameraRay(pixel.xy))), 1);\n}\nfn visibility(p: vec3f, n: vec3f) -> f32 {\n let q = lightProject(p + n * 0.035).xyz;\n let uv = vec2f(q.x * 0.5 + 0.5, 0.5 - q.y * 0.5);\n if (any(uv < vec2f(0.005)) || any(uv > vec2f(0.995)) || q.z < 0.0 || q.z > 1.0) { return 1.0; }\n var result = 0.0;\n for (var y = -1; y <= 1; y++) {\n for (var x = -1; x <= 1; x++) {\n result += textureSampleCompareLevel(shadowMap, shadowSampler, uv + vec2f(f32(x), f32(y)) / 2048.0, q.z - 0.0006);\n }\n }\n return result / 9.0;\n}\n// Dielectric coating is evaluated independently from the coloured substrate.\n// This returns the microfacet lobe without Fresnel, including the cosine term.\nfn specularLobe(n: vec3f, v: vec3f, roughness: f32) -> f32 {\n let l = frame.sun.xyz; let h = normalize(l + v);\n let nl = max(dot(n,l),0.0); let nv = max(dot(n,v),0.001);\n let nh = max(dot(n,h),0.0);\n let a = max(0.035, roughness * roughness); let a2 = a * a;\n let d = a2 / max(0.00001, 3.14159265 * pow(nh * nh * (a2 - 1.0) + 1.0, 2.0));\n let k = pow(roughness + 1.0, 2.0) / 8.0;\n let g = (nl / (nl * (1.0-k) + k)) * (nv / (nv * (1.0-k) + k));\n return d * g / max(0.001, 4.0*nl*nv) * nl;\n}\nfn brdf(c: vec3f, n: vec3f, v: vec3f, roughness: f32, metal: f32) -> vec3f {\n let h = normalize(frame.sun.xyz + v);\n let nl = max(dot(n,frame.sun.xyz),0.0);\n let vh = max(dot(v,h),0.0);\n let f0 = mix(vec3f(0.04), c, metal);\n let f = f0 + (1.0-f0) * pow(1.0-vh, 5.0);\n return (1.0-f) * (1.0-metal) * c / 3.14159265 * nl + specularLobe(n,v,roughness) * f;\n}\nfn fog(c: vec3f, p: vec3f) -> vec3f {\n let amount = 1.0 - exp(-distance(frame.eye.xyz, p) * 0.0018);\n return mix(c, vec3f(0.32, 0.44, 0.55), amount);\n}\nfn surfaceRadiance(s: Surface, front: bool) -> vec3f {\n let facing = select(select(-1.0,1.0,front),select(1.0,-1.0,front),frame.info.y>0.5);\n let coatNormal = normalize(s.normal) * facing;\n var n = coatNormal;\n let v = normalize(frame.eye.xyz - s.world);\n // Derivatives and samples must be uniform across each fragment quad.\n // Relative degeneracy: raw derivative magnitudes shrink with model scale and\n // zoom. An absolute tangent cutoff silently disabled normal maps in close-ups.\n let dpScale = max(length(dpdx(s.world)), length(dpdy(s.world)));\n let uvScale = max(length(dpdx(s.uv)), length(dpdy(s.uv)));\n let dx = dpdx(s.world) / max(dpScale, 1e-20);\n let dy = dpdy(s.world) / max(dpScale, 1e-20);\n let ux = dpdx(s.uv) / max(uvScale, 1e-20);\n let uy = dpdy(s.uv) / max(uvScale, 1e-20);\n let determinant = ux.x * uy.y - ux.y * uy.x;\n let tangent = dx * uy.y - dy * ux.y;\n let bitangent = dy * ux.x - dx * uy.x;\n let sampledNormal = textureSample(normalMap, materialSampler, s.uv).xyz * 2.0 - 1.0;\n var c = s.colour * textureSample(baseColourMap, materialSampler, s.uv).rgb;\n let orm = textureSample(ormMap, materialSampler, s.uv).rgb;\n let coatSample = textureSample(clearcoatMap, materialSampler, s.uv).rg;\n let roughness = clamp(s.material.x * orm.g, 0.04, 1.0);\n let metalness = clamp(s.material.y * orm.b, 0.0, 1.0);\n let orthogonalTangent = tangent - n * dot(n,tangent);\n let orthogonalBitangent = bitangent - n * dot(n,bitangent);\n if (dpScale > 1e-20 && uvScale > 1e-20 && abs(determinant) > 1e-6 && dot(orthogonalTangent,orthogonalTangent) > 1e-12 && dot(orthogonalBitangent,orthogonalBitangent) > 1e-12) {\n let t = normalize(orthogonalTangent) * sign(determinant);\n let b = normalize(orthogonalBitangent) * sign(determinant);\n n = normalize(t * sampledNormal.x * materialParameters.x + b * sampledNormal.y * materialParameters.x + n * max(0.001,sampledNormal.z));\n }\n if (materialParameters.y < 0.5 && s.material.z > 2.5) {\n let rock = smoothstep(0.45,0.68,noise(s.world*0.27));\n c = mix(c,vec3f(0.16,0.145,0.11),rock*0.7);\n c *= 0.75+0.45*noise(s.world*2.4);\n n = normalize(n+vec3f(noise(s.world*4.0)-0.5,0,noise(s.world*4.0+vec3f(13))-0.5)*0.28);\n } else if (materialParameters.y < 0.5 && s.material.z > 0.5 && s.material.z < 1.5) {\n let grain = noise(s.world * vec3f(18, 3, 1.6));\n c *= 0.82 + 0.30 * grain;\n } else if (materialParameters.y < 0.5 && s.material.z > 1.5) { c *= 0.88 + 0.18 * noise(s.world * 12.0); }\n let hemi = mix(vec3f(0.06,0.05,0.035), vec3f(0.16,0.22,0.29), n.y * 0.5 + 0.5);\n let direct = brdf(c, n, v, roughness, metalness) * vec3f(3.0, 2.65, 2.15) * visibility(s.world, n);\n let ambient = c * hemi * (1.0 - metalness * 0.7) * orm.r;\n let env = sky(reflect(-v,n)) * mix(vec3f(0.04), c, metalness) * (1.0-roughness) * orm.r * 0.30;\n let baseRadiance = direct + ambient + env;\n let coatCoverage = materialParameters.z * coatSample.r;\n if (coatCoverage <= 0.0) { return fog(baseRadiance,s.world); }\n // KHR_materials_clearcoat's simple Fresnel layering: varnish has its own\n // smooth normal and roughness. Its reflection never inherits the wood colour.\n let coatFresnel = 0.04 + 0.96 * pow(1.0-clamp(abs(dot(coatNormal,v)),0.0,1.0),5.0);\n let coatWeight = coatCoverage * coatFresnel;\n let coatRoughness = clamp(materialParameters.w * coatSample.g,0.04,1.0);\n let coatDirect = vec3f(3.0,2.65,2.15) * specularLobe(coatNormal,v,coatRoughness) * visibility(s.world,coatNormal);\n let coatEnvironment = sky(reflect(-v,coatNormal)) * (1.0-coatRoughness) * orm.r * 0.30;\n return fog(baseRadiance * (1.0-coatWeight) + (coatDirect+coatEnvironment) * coatWeight, s.world);\n}\n@fragment fn surfaceFragment(s: Surface, @builtin(front_facing) front: bool) -> @location(0) vec4f {\n return vec4f(display(surfaceRadiance(s,front)),1);\n}\nfn wave(p: vec2f) -> f32 {\n let t = frame.settings.z;\n return sin(dot(p,vec2f(0.35,0.23))-t*0.85)*0.13\n + sin(dot(p,vec2f(-0.61,0.42))+t*1.12)*0.065\n + sin(dot(p,vec2f(1.2,0.83))-t*1.4)*0.025\n + sin(dot(p,vec2f(3.1,-2.1))+t*1.8)*0.009;\n}\nstruct WaterResult { @location(0) colour: vec4f, @builtin(frag_depth) depth: f32 };\n@fragment fn waterFragment(@builtin(position) pixel: vec4f) -> WaterResult {\n let ray = cameraRay(pixel.xy);\n if (ray.y > -0.001) { discard; }\n var dist = (frame.viewport.z - frame.eye.y) / ray.y;\n var p = frame.eye.xyz + ray * dist;\n for (var i=0; i<3; i++) {\n dist = (frame.viewport.z + wave(p.xz) - frame.eye.y) / ray.y;\n p = frame.eye.xyz + ray * dist;\n }\n if (dist < 0.08 || dist > 499.0) { discard; }\n let eps = 0.03;\n let waveNormal = normalize(vec3f((wave(p.xz-vec2f(eps,0))-wave(p.xz+vec2f(eps,0)))/(2.0*eps),\n 1.0, (wave(p.xz-vec2f(0,eps))-wave(p.xz+vec2f(0,eps)))/(2.0*eps)));\n let n = normalize(mix(waveNormal,vec3f(0,1,0),smoothstep(35.0,150.0,dist)));\n let v = -ray;\n let fresnel = 0.02 + 0.98 * pow(1.0-max(dot(n,v),0.0),5.0);\n let uv = clamp(pixel.xy / frame.viewport.xy + n.xz * 0.018, vec2f(0.002), vec2f(0.998));\n // Reflection target is HDR linear; tone mapping happens once after mixing.\n let reflected = textureSampleLevel(reflectionMap, reflectionSampler, uv, 0).rgb;\n let shadow = visibility(p, n);\n var c = mix(vec3f(0.008,0.05,0.065) * (0.5+0.5*shadow), reflected, fresnel);\n c += brdf(vec3f(0.01),n,v,0.14,0.0) * vec3f(2.5,2.15,1.7) * shadow;\n var foam = 0.0;\n for (var i=0u; i<4u; i++) {\n if (f32(i) >= frame.info.x) { break; }\n let w = frame.wakes[i]; let delta = p.xz - w.xy;\n let along = dot(delta, vec2f(sin(w.z), cos(w.z)));\n let across = abs(dot(delta,vec2f(cos(w.z),-sin(w.z))));\n let ribbon = exp(-pow((across - max(0.0,-along)*0.28 - 0.65)*4.0,2.0));\n foam += ribbon * (1.0-smoothstep(-1.0,0.5,along)) * exp(min(0.0,along)*0.25) * (0.4+0.6*noise(vec3f(p.x*5.0,p.z*5.0,frame.settings.z*0.5)));\n }\n c = mix(c,vec3f(0.48,0.61,0.62),clamp(foam*0.42,0.0,0.55));\n let clip = project(p);\n return WaterResult(vec4f(display(fog(c,p)),1),clip.z/clip.w);\n}\n// Keep reflection radiance linear, including sky. Reusing the lighting calculation\n// rather than sampling a screenshot avoids double tone mapping on the water.\n@fragment fn reflectionSky(@builtin(position) pixel: vec4f) -> @location(0) vec4f {\n return vec4f(sky(cameraRay(pixel.xy)),1);\n}\n@fragment fn reflectionSurface(s: Surface, @builtin(front_facing) front: bool) -> @location(0) vec4f {\n let radiance = surfaceRadiance(s,front);\n if (s.world.y < frame.viewport.z) { discard; }\n return vec4f(radiance,1);\n}\n`;\n","// Decoded RGBA contract matches gpu-shared's glTF loader. No network or DOM work.\nconst MAX_BYTES = 64 * 1024 * 1024;\nconst MAPS = [\"baseColor\", \"normal\", \"orm\", \"clearcoatMap\"];\nconst defaults = {\n baseColor: [255, 255, 255, 255],\n normal: [128, 128, 255, 255],\n orm: [255, 255, 255, 255],\n clearcoatMap: [255, 255, 255, 255],\n};\nconst dimension = (n) =>\n Number.isInteger(n) && n >= 1 && n <= 2048 && (n & (n - 1)) === 0;\n\nexport function validateNativeMaterials(materials) {\n if (!Array.isArray(materials) || materials.length > 16)\n throw new Error(\"materials must contain at most 16 entries.\");\n let bytes = 0;\n for (const material of materials) {\n if (!material || typeof material !== \"object\")\n throw new Error(\"Each material must be an object.\");\n if (\n !Number.isFinite(material.normalScale ?? 1) ||\n (material.normalScale ?? 1) < 0 ||\n (material.normalScale ?? 1) > 4\n ) {\n throw new Error(\"material normalScale must be between 0 and 4.\");\n }\n for (const key of [\"clearcoat\", \"clearcoatRoughness\"]) {\n const value = material[key] ?? 0;\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new Error(`material ${key} must be between 0 and 1.`);\n }\n }\n for (const key of MAPS) {\n const map = material[key];\n if (map === undefined) continue;\n if (\n !map ||\n !dimension(map.width) ||\n !dimension(map.height) ||\n !(\n map.data instanceof Uint8Array ||\n map.data instanceof Uint8ClampedArray\n ) ||\n map.data.length !== map.width * map.height * 4\n ) {\n throw new Error(\n `material ${key} texture must contain RGBA8 data with power-of-two dimensions between 1 and 2048.`,\n );\n }\n bytes += map.data.byteLength;\n if (bytes > MAX_BYTES)\n throw new Error(\"material textures exceed the 64 MiB source budget.\");\n }\n }\n}\nconst linear = (x) => (x <= 0.04045 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4);\nconst srgb = (x) =>\n x <= 0.0031308 ? x * 12.92 : 1.055 * x ** (1 / 2.4) - 0.055;\n\nfunction nextMip(image, colour) {\n const width = Math.max(1, image.width / 2),\n height = Math.max(1, image.height / 2);\n const data = new Uint8Array(width * height * 4);\n for (let y = 0; y < height; y++)\n for (let x = 0; x < width; x++)\n for (let c = 0; c < 4; c++) {\n let sum = 0;\n for (let dy = 0; dy < 2; dy++)\n for (let dx = 0; dx < 2; dx++) {\n const offset =\n (Math.min(image.height - 1, y * 2 + dy) * image.width +\n Math.min(image.width - 1, x * 2 + dx)) *\n 4 +\n c;\n const value = image.data[offset] / 255;\n sum += colour && c < 3 ? linear(value) : value;\n }\n data[(y * width + x) * 4 + c] = Math.round(\n 255 * (colour && c < 3 ? srgb(sum / 4) : sum / 4),\n );\n }\n return { width, height, data };\n}\n\nexport function createNativeMaterialTextures(device, materials, own) {\n // Index zero is the backwards-compatible material; caller materials start at one.\n return [{}, ...materials].map((material, index) => {\n const result = {\n normalScale: material.normal ? (material.normalScale ?? 1) : 0,\n authored: [\"baseColor\", \"normal\", \"orm\"].some((key) => material[key]),\n clearcoat: material.clearcoat ?? 0,\n clearcoatRoughness: material.clearcoatRoughness ?? 0,\n };\n for (const key of MAPS) {\n let level = material[key] ?? {\n width: 1,\n height: 1,\n data: new Uint8Array(defaults[key]),\n };\n const mipLevelCount = 1 + Math.log2(Math.max(level.width, level.height));\n const texture = own(\n device.createTexture({\n label: `native.material.${index}.${key}`,\n size: { width: level.width, height: level.height },\n format: key === \"baseColor\" ? \"rgba8unorm-srgb\" : \"rgba8unorm\",\n mipLevelCount,\n usage: 0x06,\n }),\n );\n for (let mipLevel = 0; mipLevel < mipLevelCount; mipLevel++) {\n device.queue.writeTexture(\n { texture, mipLevel },\n level.data,\n { bytesPerRow: level.width * 4, rowsPerImage: level.height },\n { width: level.width, height: level.height, depthOrArrayLayers: 1 },\n );\n if (mipLevel + 1 < mipLevelCount)\n level = nextMip(level, key === \"baseColor\");\n }\n result[key] = texture.createView();\n }\n return result;\n });\n}\n","import { createGpuRenderer } from \"./renderer-webgpu-runtime.js\";\nimport { nativeSceneShader } from \"./native-scene-shader.js\";\nimport {\n validateNativeMaterials,\n createNativeMaterialTextures,\n} from \"./native-surface-materials.js\";\n\nconst STRIDE = 12;\nconst UNIFORM_BYTES = 256;\nconst SHADOW_SIZE = 2048;\nconst sub = (a, b) => a.map((v, i) => v - b[i]);\nconst cross = (a, b) => [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n];\nconst unit = (a) => {\n const length = Math.hypot(...a);\n return a.map((v) => v / length);\n};\nconst finiteVector = (a) =>\n Array.isArray(a) && a.length === 3 && a.every(Number.isFinite);\n\nfunction validateFrame(frame, maxVertices, materialCount) {\n const { vertices, camera, time = 0 } = frame ?? {};\n if (\n !(vertices instanceof Float32Array) ||\n vertices.length % (STRIDE * 3) !== 0 ||\n vertices.length > maxVertices * STRIDE ||\n !vertices.every(Number.isFinite)\n ) {\n throw new Error(\n `vertices must contain bounded, finite interleaved triangles (12 floats per vertex); received ${vertices?.length ?? 0} floats; first nonfinite component ${vertices instanceof Float32Array ? vertices.findIndex((v) => !Number.isFinite(v)) : \"unknown\"}.`,\n );\n }\n if (\n !finiteVector(camera?.eye) ||\n !finiteVector(camera?.target) ||\n Math.hypot(...sub(camera.eye, camera.target)) < 0.001 ||\n !Number.isFinite(camera.fov ?? 54) ||\n (camera.fov ?? 54) < 10 ||\n (camera.fov ?? 54) > 120\n ) {\n throw new Error(\n \"camera must provide distinct finite eye/target vectors and a 10–120 degree fov.\",\n );\n }\n if (!Number.isFinite(time)) throw new Error(\"time must be finite.\");\n if (!Number.isFinite(frame.waterLevel ?? 0))\n throw new Error(\"waterLevel must be finite.\");\n if (\n frame.wakes !== undefined &&\n (!Array.isArray(frame.wakes) ||\n frame.wakes.length > 4 ||\n frame.wakes.some(\n (w) => !Array.isArray(w) || w.length !== 3 || !w.every(Number.isFinite),\n ))\n ) {\n throw new Error(\n \"wakes must contain at most four finite [x, z, heading] entries.\",\n );\n }\n const count = vertices.length / STRIDE;\n if (\n frame.texcoords !== undefined &&\n (!(frame.texcoords instanceof Float32Array) ||\n frame.texcoords.length !== count * 2 ||\n !frame.texcoords.every(Number.isFinite))\n ) {\n throw new Error(\n \"texcoords must contain two finite coordinates per vertex.\",\n );\n }\n if (frame.surfaces !== undefined) {\n if (\n !Array.isArray(frame.surfaces) ||\n frame.surfaces.length > 256 ||\n !frame.texcoords\n ) {\n throw new Error(\n \"surfaces require texcoords and at most 256 contiguous draw ranges.\",\n );\n }\n let end = 0;\n for (const range of frame.surfaces) {\n if (\n !range ||\n range.firstVertex !== end ||\n !Number.isInteger(range.vertexCount) ||\n range.vertexCount <= 0 ||\n range.vertexCount % 3 !== 0 ||\n !Number.isInteger(range.materialIndex) ||\n range.materialIndex < 0 ||\n range.materialIndex >= materialCount\n ) {\n throw new Error(\n \"surface ranges must cover triangles in order and reference a valid material.\",\n );\n }\n end += range.vertexCount;\n }\n if (end !== count)\n throw new Error(\"surface ranges must cover every vertex exactly once.\");\n }\n return { ...frame, time };\n}\n\nfunction frameUniforms(frame, width, height, reflected = false) {\n const eye = [...frame.camera.eye];\n let forward = unit(sub(frame.camera.target, eye));\n const referenceUp = Math.abs(forward[1]) > 0.999 ? [0, 0, 1] : [0, 1, 0];\n const right = unit(cross(forward, referenceUp));\n const up = unit(cross(right, forward));\n const waterLevel = frame.waterLevel ?? 0;\n if (reflected) {\n eye[1] = 2 * waterLevel - eye[1];\n forward = [forward[0], -forward[1], forward[2]];\n right[1] *= -1;\n up[1] *= -1;\n }\n const sun = unit([-0.62, 0.48, 0.62]);\n const lightForward = sun.map((x) => -x);\n const lightRight = unit(cross(lightForward, [0, 1, 0]));\n const lightUp = unit(cross(lightRight, lightForward));\n const uniforms = new Float32Array(64);\n uniforms.set(eye, 0);\n uniforms.set(right, 4);\n uniforms.set(up, 8);\n uniforms.set(forward, 12);\n uniforms.set(\n [\n Math.tan(((frame.camera.fov ?? 54) * Math.PI) / 360),\n width / height,\n frame.time,\n 0.86,\n ],\n 16,\n );\n uniforms.set(sun, 20);\n uniforms.set(lightRight, 24);\n uniforms.set(lightUp, 28);\n uniforms.set(lightForward, 32);\n uniforms.set([sun[0] * 45, sun[1] * 45, sun[2] * 45 + 4], 36);\n uniforms.set([width, height, waterLevel, 0], 40);\n (frame.wakes ?? []).forEach((wake, index) =>\n uniforms.set([...wake, 0], 44 + index * 4),\n );\n uniforms.set([(frame.wakes ?? []).length, reflected ? 1 : 0, 0, 0], 60);\n return uniforms;\n}\n\n/** Native raster surfaces. The caller owns simulation, animation and scheduling. */\nexport async function createNativeSceneRenderer(options = {}) {\n const maxVertices = options.maxVertices ?? 300_000;\n const materials = options.materials ?? [];\n validateNativeMaterials(materials);\n const materialCount = materials.length;\n if (\n !Number.isInteger(maxVertices) ||\n maxVertices < 3 ||\n maxVertices > 600_000\n ) {\n throw new Error(\"maxVertices must be an integer between 3 and 600000.\");\n }\n let base;\n let destroyed = false;\n let available = true;\n let targets = null;\n let vertexBuffer = null;\n let uvBuffer = null;\n let vertexCapacity = 0;\n let pendingFrame = null;\n let submittedFrames = 0;\n let vertexCount = 0;\n const owned = new Set();\n const own = (resource) => {\n owned.add(resource);\n return resource;\n };\n const release = (resource) => {\n resource.destroy();\n owned.delete(resource);\n };\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n base?.destroy();\n for (const resource of owned) resource.destroy();\n owned.clear();\n base?.device.destroy?.();\n };\n\n try {\n base = await createGpuRenderer({\n ...options,\n alpha: false,\n encodeFrame: encode,\n });\n const { device, format } = base;\n device.lost?.then(() => {\n available = false;\n if (!destroyed)\n options.onUnavailable?.(\n \"WebGPU device lost. Reload the demo to reconnect.\",\n );\n });\n const module = device.createShaderModule({\n label: \"plasius.native-scene\",\n code: nativeSceneShader,\n });\n const compilation = await module.getCompilationInfo?.();\n const shaderErrors =\n compilation?.messages.filter((m) => m.type === \"error\") ?? [];\n if (shaderErrors.length)\n throw new Error(\n `Native scene shader compilation failed: ${shaderErrors.map((m) => `${m.lineNum}: ${m.message}`).join(\"; \")}`,\n );\n const uniformLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: 3,\n buffer: { type: \"uniform\", minBindingSize: UNIFORM_BYTES },\n },\n ],\n });\n const shadowLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: 2, texture: { sampleType: \"depth\" } },\n { binding: 1, visibility: 2, sampler: { type: \"comparison\" } },\n ],\n });\n const reflectionLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: 2, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: 2, sampler: { type: \"filtering\" } },\n ],\n });\n const materialLayout = device.createBindGroupLayout({\n entries: [\n ...[0, 1, 2, 5].map((binding) => ({\n binding,\n visibility: 2,\n texture: { sampleType: \"float\" },\n })),\n { binding: 3, visibility: 2, sampler: { type: \"filtering\" } },\n {\n binding: 4,\n visibility: 2,\n buffer: { type: \"uniform\", minBindingSize: 16 },\n },\n ],\n });\n const materialSampler = device.createSampler({\n addressModeU: \"repeat\",\n addressModeV: \"repeat\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n mipmapFilter: \"linear\",\n maxAnisotropy: 4,\n });\n const materialGroups = createNativeMaterialTextures(\n device,\n materials,\n own,\n ).map((material) => {\n const params = own(\n device.createBuffer({\n size: 16,\n usage: 0x48,\n label: \"native.material-parameters\",\n }),\n );\n device.queue.writeBuffer(\n params,\n 0,\n new Float32Array([\n material.normalScale,\n material.authored ? 1 : 0,\n material.clearcoat,\n material.clearcoatRoughness,\n ]),\n );\n return device.createBindGroup({\n layout: materialLayout,\n entries: [\n { binding: 0, resource: material.baseColor },\n { binding: 1, resource: material.normal },\n { binding: 2, resource: material.orm },\n { binding: 3, resource: materialSampler },\n { binding: 4, resource: { buffer: params } },\n { binding: 5, resource: material.clearcoatMap },\n ],\n });\n });\n const uniformBuffer = own(\n device.createBuffer({\n label: \"native.frame\",\n size: UNIFORM_BYTES,\n usage: 0x48,\n }),\n );\n const reflectionBuffer = own(\n device.createBuffer({\n label: \"native.reflected-frame\",\n size: UNIFORM_BYTES,\n usage: 0x48,\n }),\n );\n const bindUniform = (buffer) =>\n device.createBindGroup({\n layout: uniformLayout,\n entries: [{ binding: 0, resource: { buffer } }],\n });\n const mainGroup = bindUniform(uniformBuffer);\n const reflectedGroup = bindUniform(reflectionBuffer);\n const shadowTexture = own(\n device.createTexture({\n label: \"native.shadow\",\n size: [SHADOW_SIZE, SHADOW_SIZE],\n format: \"depth32float\",\n usage: 0x14,\n }),\n );\n const shadowView = shadowTexture.createView();\n const shadowGroup = device.createBindGroup({\n layout: shadowLayout,\n entries: [\n { binding: 0, resource: shadowView },\n {\n binding: 1,\n resource: device.createSampler({\n compare: \"less-equal\",\n minFilter: \"linear\",\n magFilter: \"linear\",\n }),\n },\n ],\n });\n const reflectionSampler = device.createSampler({\n minFilter: \"linear\",\n magFilter: \"linear\",\n });\n const attributes = [0, 1, 2, 3].map((i) => ({\n shaderLocation: i,\n offset: i * 12,\n format: \"float32x3\",\n }));\n const createPipeline =\n device.createRenderPipelineAsync?.bind(device) ??\n device.createRenderPipeline.bind(device);\n const pipeline = (\n label,\n vertex,\n fragment,\n colourFormat,\n samples,\n layouts,\n geometry = false,\n ) =>\n createPipeline({\n label: `native.${label}`,\n layout: device.createPipelineLayout({ bindGroupLayouts: layouts }),\n vertex: {\n module,\n entryPoint: vertex,\n ...(geometry\n ? {\n buffers: [\n {\n arrayStride: STRIDE * 4,\n attributes:\n vertex === \"shadowVertex\"\n ? attributes.slice(0, 1)\n : attributes,\n },\n ...(vertex === \"shadowVertex\"\n ? []\n : [\n {\n arrayStride: 8,\n attributes: [\n {\n shaderLocation: 4,\n offset: 0,\n format: \"float32x2\",\n },\n ],\n },\n ]),\n ],\n }\n : {}),\n },\n ...(fragment\n ? {\n fragment: {\n module,\n entryPoint: fragment,\n targets: [{ format: colourFormat }],\n },\n }\n : {}),\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: \"depth32float\",\n depthWriteEnabled: label !== \"sky\" && label !== \"reflection-sky\",\n depthCompare: \"less-equal\",\n },\n multisample: { count: samples },\n });\n const shadowPipeline = await pipeline(\n \"shadow\",\n \"shadowVertex\",\n null,\n null,\n 1,\n [uniformLayout],\n true,\n );\n const surfacePipeline = await pipeline(\n \"surface\",\n \"surfaceVertex\",\n \"surfaceFragment\",\n format,\n 4,\n [uniformLayout, shadowLayout, materialLayout],\n true,\n );\n const skyPipeline = await pipeline(\n \"sky\",\n \"fullscreenVertex\",\n \"skyFragment\",\n format,\n 4,\n [uniformLayout],\n );\n const waterPipeline = await pipeline(\n \"water\",\n \"fullscreenVertex\",\n \"waterFragment\",\n format,\n 4,\n [uniformLayout, shadowLayout, materialLayout, reflectionLayout],\n );\n const reflectedSurfacePipeline = await pipeline(\n \"reflection-surface\",\n \"surfaceVertex\",\n \"reflectionSurface\",\n \"rgba16float\",\n 1,\n [uniformLayout, shadowLayout, materialLayout],\n true,\n );\n const reflectedSkyPipeline = await pipeline(\n \"reflection-sky\",\n \"fullscreenVertex\",\n \"reflectionSky\",\n \"rgba16float\",\n 1,\n [uniformLayout],\n );\n\n function ensureTargets() {\n const limit = Math.min(device.limits.maxTextureDimension2D, 3840);\n const requestedWidth = Math.max(1, Number(base.canvas.width) || 1);\n const requestedHeight = Math.max(1, Number(base.canvas.height) || 1);\n const scale = Math.min(\n 1,\n limit / requestedWidth,\n limit / requestedHeight,\n Math.sqrt((1920 * 1080) / (requestedWidth * requestedHeight)),\n );\n const width = Math.max(1, Math.floor(requestedWidth * scale));\n const height = Math.max(1, Math.floor(requestedHeight * scale));\n base.canvas.width = width;\n base.canvas.height = height;\n if (targets?.width === width && targets?.height === height) return;\n if (targets) for (const texture of targets.textures) release(texture);\n const reflectionWidth = Math.min(1280, Math.max(1, Math.ceil(width / 2)));\n const reflectionHeight = Math.max(\n 1,\n Math.round((height * reflectionWidth) / width),\n );\n const texture = (\n label,\n w,\n h,\n pixelFormat,\n sampleCount = 1,\n usage = 0x10,\n ) =>\n own(\n device.createTexture({\n label,\n size: [w, h],\n format: pixelFormat,\n sampleCount,\n usage,\n }),\n );\n const colour = texture(\"native.msaa-colour\", width, height, format, 4);\n const depth = texture(\n \"native.msaa-depth\",\n width,\n height,\n \"depth32float\",\n 4,\n );\n const reflection = texture(\n \"native.reflection\",\n reflectionWidth,\n reflectionHeight,\n \"rgba16float\",\n 1,\n 0x14,\n );\n const reflectionDepth = texture(\n \"native.reflection-depth\",\n reflectionWidth,\n reflectionHeight,\n \"depth32float\",\n );\n const reflectionView = reflection.createView();\n targets = {\n width,\n height,\n reflectionWidth,\n reflectionHeight,\n colour: colour.createView(),\n depth: depth.createView(),\n reflection: reflectionView,\n reflectionDepth: reflectionDepth.createView(),\n textures: [colour, depth, reflection, reflectionDepth],\n reflectionGroup: device.createBindGroup({\n layout: reflectionLayout,\n entries: [\n { binding: 0, resource: reflectionView },\n { binding: 1, resource: reflectionSampler },\n ],\n }),\n };\n }\n\n function encode({ encoder, view }) {\n const depthAttachment = (depthView) => ({\n view: depthView,\n depthLoadOp: \"clear\",\n depthClearValue: 1,\n depthStoreOp: \"store\",\n });\n const drawGeometry = (pass, p, uniforms) => {\n pass.setPipeline(p);\n pass.setBindGroup(0, uniforms);\n if (p !== shadowPipeline) pass.setBindGroup(1, shadowGroup);\n if (vertexCount > 0) {\n pass.setVertexBuffer(0, vertexBuffer);\n if (p === shadowPipeline) {\n pass.draw(vertexCount);\n } else {\n pass.setVertexBuffer(1, uvBuffer);\n if (pendingFrame.surfaces) {\n for (const range of pendingFrame.surfaces) {\n pass.setBindGroup(2, materialGroups[range.materialIndex + 1]);\n pass.draw(range.vertexCount, 1, range.firstVertex);\n }\n } else {\n pass.setBindGroup(2, materialGroups[0]);\n pass.draw(vertexCount);\n }\n }\n }\n };\n const shadowPass = encoder.beginRenderPass({\n label: \"native.shadow\",\n colorAttachments: [],\n depthStencilAttachment: depthAttachment(shadowView),\n });\n drawGeometry(shadowPass, shadowPipeline, mainGroup);\n shadowPass.end();\n const reflectedPass = encoder.beginRenderPass({\n label: \"native.reflection\",\n colorAttachments: [\n {\n view: targets.reflection,\n loadOp: \"clear\",\n storeOp: \"store\",\n clearValue: [0, 0, 0, 1],\n },\n ],\n depthStencilAttachment: depthAttachment(targets.reflectionDepth),\n });\n reflectedPass.setPipeline(reflectedSkyPipeline);\n reflectedPass.setBindGroup(0, reflectedGroup);\n reflectedPass.draw(3);\n drawGeometry(reflectedPass, reflectedSurfacePipeline, reflectedGroup);\n reflectedPass.end();\n const pass = encoder.beginRenderPass({\n label: \"native.scene\",\n colorAttachments: [\n {\n view: targets.colour,\n resolveTarget: view,\n loadOp: \"clear\",\n storeOp: \"discard\",\n clearValue: [0, 0, 0, 1],\n },\n ],\n depthStencilAttachment: depthAttachment(targets.depth),\n });\n pass.setPipeline(skyPipeline);\n pass.setBindGroup(0, mainGroup);\n pass.draw(3);\n if (pendingFrame.water !== false) {\n pass.setPipeline(waterPipeline);\n pass.setBindGroup(1, shadowGroup);\n pass.setBindGroup(2, materialGroups[0]);\n pass.setBindGroup(3, targets.reflectionGroup);\n pass.draw(3);\n }\n drawGeometry(pass, surfacePipeline, mainGroup);\n pass.end();\n }\n\n return {\n render(input) {\n if (destroyed) throw new Error(\"Native scene renderer was destroyed.\");\n if (!available) throw new Error(\"WebGPU device was lost.\");\n pendingFrame = validateFrame(input, maxVertices, materialCount);\n const data = pendingFrame.vertices;\n ensureTargets();\n if (data.byteLength > vertexCapacity) {\n if (vertexBuffer) release(vertexBuffer);\n if (uvBuffer) release(uvBuffer);\n vertexCapacity = Math.min(\n maxVertices * STRIDE * 4,\n Math.max(4096, 2 ** Math.ceil(Math.log2(data.byteLength))),\n );\n uvBuffer = own(\n device.createBuffer({\n label: \"native.surface-uvs\",\n size: Math.ceil(vertexCapacity / (STRIDE * 4)) * 8,\n usage: 0x28,\n }),\n );\n vertexBuffer = own(\n device.createBuffer({\n label: \"native.surface-vertices\",\n size: vertexCapacity,\n usage: 0x28,\n }),\n );\n }\n if (pendingFrame.texcoords?.byteLength)\n device.queue.writeBuffer(uvBuffer, 0, pendingFrame.texcoords);\n vertexCount = data.length / STRIDE;\n if (data.byteLength) device.queue.writeBuffer(vertexBuffer, 0, data);\n device.queue.writeBuffer(\n uniformBuffer,\n 0,\n frameUniforms(pendingFrame, targets.width, targets.height),\n );\n device.queue.writeBuffer(\n reflectionBuffer,\n 0,\n frameUniforms(\n pendingFrame,\n targets.reflectionWidth,\n targets.reflectionHeight,\n true,\n ),\n );\n base.renderOnce(pendingFrame.time * 1000);\n submittedFrames++;\n return this.getSnapshot();\n },\n getSnapshot() {\n return {\n backend: \"webgpu-raster\",\n available: available && !destroyed,\n submittedFrames,\n vertexCount,\n shadowMapSize: SHADOW_SIZE,\n samples: 4,\n width: targets?.width ?? 0,\n height: targets?.height ?? 0,\n };\n },\n destroy,\n };\n } catch (error) {\n destroy();\n throw error;\n }\n}\n","const STANDARD_TEXTURE_BINDINGS = Object.freeze([\n [\"baseColor\", \"baseColorTexture\"],\n [\"metallicRoughness\", \"metallicRoughnessTexture\"],\n [\"normal\", \"normalTexture\"],\n [\"occlusion\", \"occlusionTexture\"],\n [\"emissive\", \"emissiveTexture\"],\n]);\n\nconst EXTENSION_TEXTURE_BINDINGS = Object.freeze([\n [\"clearcoat\", \"clearcoat\", \"clearcoatTexture\"],\n [\"clearcoatRoughness\", \"clearcoat\", \"clearcoatRoughnessTexture\"],\n [\"clearcoatNormal\", \"clearcoat\", \"clearcoatNormalTexture\"],\n [\"transmission\", \"transmission\", \"transmissionTexture\"],\n [\"sheenColor\", \"sheen\", \"sheenColorTexture\"],\n [\"sheenRoughness\", \"sheen\", \"sheenRoughnessTexture\"],\n]);\n\nfunction requireArray(value, label) {\n if (!Array.isArray(value)) {\n throw new TypeError(`${label} must be an array.`);\n }\n return value;\n}\n\nfunction requireMap(value, label) {\n if (!value || typeof value !== \"object\" || typeof value.get !== \"function\") {\n throw new TypeError(`${label} must provide a ReadonlyMap-compatible get method.`);\n }\n return value;\n}\n\nfunction textureSample(binding, textures, label, extra = {}) {\n if (binding === undefined || binding === null) {\n return undefined;\n }\n\n const sample = textures.get(binding.textureId);\n if (!sample) {\n throw new Error(`Missing decoded texture sample ${binding.textureId} for ${label}.`);\n }\n const width = Number(sample.width);\n const height = Number(sample.height);\n const data = sample.data;\n const dataLength = data && typeof data.length === \"number\" ? data.length : -1;\n if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1) {\n throw new TypeError(`Decoded texture sample ${binding.textureId} has invalid dimensions.`);\n }\n if (width > 4_096 || height > 4_096 || width * height > 4_096 * 4_096) {\n throw new RangeError(`Decoded texture sample ${binding.textureId} exceeds the 4096-pixel resource limit.`);\n }\n if (!(Array.isArray(data) || ArrayBuffer.isView(data)) || dataLength < width * height * 4) {\n throw new TypeError(`Decoded texture sample ${binding.textureId} must contain width × height × 4 RGBA values.`);\n }\n\n return Object.freeze({\n ...sample,\n ...(binding.texCoordSet === undefined ? {} : { texCoord: binding.texCoordSet }),\n ...extra,\n });\n}\n\nfunction cloneMaterialExtensions(material, textures) {\n const extensions = { ...(material.extensions ?? {}) };\n if (material.workflow === \"unlit\") {\n const unlitKey = \"KHR_materials_unlit\";\n const unlitValue = extensions[unlitKey] ?? extensions.unlit ?? {};\n if (typeof unlitValue !== \"object\" || unlitValue === null || Array.isArray(unlitValue)) {\n throw new TypeError(`Canonical material extension ${unlitKey} must be an object.`);\n }\n extensions[unlitKey] = { ...unlitValue, enabled: true };\n }\n for (const [bindingName, extensionName, textureKey] of EXTENSION_TEXTURE_BINDINGS) {\n const binding = material.textures?.[bindingName];\n if (!binding) {\n continue;\n }\n\n const extensionKey = `KHR_materials_${extensionName}`;\n const extensionValue = extensions[extensionKey] ?? extensions[extensionName] ?? {};\n if (typeof extensionValue !== \"object\" || extensionValue === null || Array.isArray(extensionValue)) {\n throw new TypeError(`Canonical material extension ${extensionKey} must be an object.`);\n }\n extensions[extensionKey] = {\n ...extensionValue,\n [textureKey]: textureSample(binding, textures, `${extensionKey}.${textureKey}`),\n };\n }\n return extensions;\n}\n\nfunction mapMaterial(material, materialRefId, textures) {\n if (!material) {\n return { materialRefId };\n }\n if (material.alphaMode === \"mask\") {\n throw new Error(\"Canonical alphaMode mask is unsupported by WavefrontMeshInput.\");\n }\n if (material.workflow !== \"metallic-roughness\" && material.workflow !== \"unlit\") {\n throw new Error(`Unsupported canonical material workflow: ${material.workflow}.`);\n }\n\n const mapped = {\n materialRefId,\n ...(material.alphaMode === \"blend\" ? { materialKind: \"transparent\" } : {}),\n baseColor: material.baseColorFactor,\n emission: material.emissiveFactor\n ? [...material.emissiveFactor, 1]\n : [0, 0, 0, 1],\n roughness: material.roughnessFactor,\n metallic: material.metallicFactor,\n opacity: material.alphaMode === \"opaque\" ? 1 : material.baseColorFactor?.[3],\n clearcoat: material.clearcoatFactor,\n clearcoatRoughness: material.clearcoatRoughnessFactor,\n transmission: material.transmissionFactor,\n sheenColor: material.sheenColorFactor,\n extensions: cloneMaterialExtensions(material, textures),\n };\n\n for (const [bindingName, inputName] of STANDARD_TEXTURE_BINDINGS) {\n const binding = material.textures?.[bindingName];\n if (!binding) {\n continue;\n }\n const extra = bindingName === \"normal\" && material.normalScale !== undefined\n ? { scale: material.normalScale }\n : bindingName === \"occlusion\" && material.occlusionStrength !== undefined\n ? { strength: material.occlusionStrength }\n : {};\n mapped[inputName] = textureSample(binding, textures, inputName, extra);\n }\n\n return mapped;\n}\n\n/**\n * Maps decoded canonical mesh primitives into the renderer's existing Wavefront\n * input contract. Geometry and image decoding remain upstream responsibilities.\n */\nexport function createCanonicalWavefrontMeshInputs({ document, geometry, textures = new Map() } = {}) {\n if (!document || typeof document !== \"object\") {\n throw new TypeError(\"Canonical model document is required.\");\n }\n const meshes = requireArray(document.meshes, \"Canonical model meshes\");\n const materials = requireArray(document.materials, \"Canonical model materials\");\n const geometryInputs = requireArray(geometry, \"Renderer-ready geometry\");\n const textureSamples = requireMap(textures, \"Decoded texture samples\");\n\n const geometryByPrimitiveId = new Map();\n for (const entry of geometryInputs) {\n if (!entry || typeof entry.primitiveId !== \"string\" || entry.primitiveId.length === 0) {\n throw new TypeError(\"Renderer-ready geometry requires a non-empty primitiveId.\");\n }\n if (geometryByPrimitiveId.has(entry.primitiveId)) {\n throw new Error(`Duplicate renderer-ready geometry for primitive ${entry.primitiveId}.`);\n }\n geometryByPrimitiveId.set(entry.primitiveId, entry);\n }\n\n const materialsById = new Map();\n const materialRefIds = new Map();\n materials.forEach((material, index) => {\n if (!material || typeof material.id !== \"string\" || material.id.length === 0) {\n throw new TypeError(\"Canonical materials require a non-empty id.\");\n }\n if (materialsById.has(material.id)) {\n throw new Error(`Duplicate canonical material ${material.id}.`);\n }\n materialsById.set(material.id, material);\n materialRefIds.set(material.id, index + 1);\n });\n\n const output = [];\n const consumedPrimitiveIds = new Set();\n const canonicalPrimitiveIds = new Set();\n for (const mesh of meshes) {\n if (!mesh || typeof mesh.id !== \"string\") {\n throw new TypeError(\"Canonical meshes require a string id.\");\n }\n for (const primitive of requireArray(mesh.primitives, `Primitives for mesh ${mesh.id}`)) {\n if (!primitive || typeof primitive.id !== \"string\" || primitive.id.length === 0) {\n throw new TypeError(`Canonical mesh ${mesh.id} contains a primitive without an id.`);\n }\n if (canonicalPrimitiveIds.has(primitive.id)) {\n throw new Error(`Duplicate canonical primitive ${primitive.id}.`);\n }\n canonicalPrimitiveIds.add(primitive.id);\n if (primitive.topology !== \"triangles\") {\n throw new Error(`Unsupported canonical primitive topology: ${primitive.topology}.`);\n }\n const source = geometryByPrimitiveId.get(primitive.id);\n if (!source) {\n throw new Error(`Missing renderer-ready geometry for primitive ${primitive.id}.`);\n }\n consumedPrimitiveIds.add(primitive.id);\n\n let material = null;\n let materialRefId = 0;\n if (primitive.materialId !== undefined) {\n material = materialsById.get(primitive.materialId);\n if (!material) {\n throw new Error(`Missing canonical material ${primitive.materialId} for primitive ${primitive.id}.`);\n }\n materialRefId = materialRefIds.get(primitive.materialId);\n }\n\n output.push(Object.freeze({\n id: output.length + 1,\n positions: source.positions,\n ...(source.indices === undefined ? {} : { indices: source.indices }),\n ...(source.normals === undefined ? {} : { normals: source.normals }),\n ...((source.texcoords ?? source.uvs) === undefined\n ? {}\n : { uvs: source.texcoords ?? source.uvs }),\n ...mapMaterial(material, materialRefId, textureSamples),\n }));\n }\n }\n\n for (const primitiveId of geometryByPrimitiveId.keys()) {\n if (!consumedPrimitiveIds.has(primitiveId)) {\n throw new Error(`Renderer-ready geometry references unknown primitive ${primitiveId}.`);\n }\n }\n\n return Object.freeze(output);\n}\n","import { resolveCameraRigFrame } from \"@plasius/gpu-camera\";\nimport { createAnimatedGltfModel } from \"./animated-gltf-model.js\";\n\nconst DEFAULT_CAMERA = Object.freeze({\n mode: \"lagged-follow\",\n viewMode: \"spectator\",\n cubicBezier: [0.22, 0.61, 0.36, 1],\n lagMs: 240,\n lookAheadMs: 320,\n offset: [0, 2.4, 5.5],\n constraints: Object.freeze({\n maxDistance: 10,\n firstPersonHeadOffset: 0.05,\n }),\n headLook: Object.freeze({\n enabled: true,\n returnMs: 240,\n }),\n});\n\nfunction nowMs() {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerp3(a, b, t) {\n return [\n lerp(a[0] ?? 0, b[0] ?? 0, t),\n lerp(a[1] ?? 0, b[1] ?? 0, t),\n lerp(a[2] ?? 0, b[2] ?? 0, t),\n ];\n}\n\nfunction normalize3(value, fallback = [0, 0, -1]) {\n if (!Array.isArray(value) || value.length < 3) {\n return [...fallback];\n }\n const vector = [\n Number.isFinite(Number(value[0])) ? Number(value[0]) : fallback[0],\n Number.isFinite(Number(value[1])) ? Number(value[1]) : fallback[1],\n Number.isFinite(Number(value[2])) ? Number(value[2]) : fallback[2],\n ];\n const length = Math.hypot(vector[0], vector[1], vector[2]);\n if (length <= 1e-6) {\n return [...fallback];\n }\n return [vector[0] / length, vector[1] / length, vector[2] / length];\n}\n\nfunction clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction bezierY([, y1, , y2], t) {\n const u = 1 - t;\n return 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t;\n}\n\nfunction durationFromBeats(beats) {\n return beats.reduce((total, beat) => total + Math.max(0, beat.durationMs ?? 0), 0);\n}\n\nfunction definedCameraOverrides(camera) {\n if (!camera || typeof camera !== \"object\") {\n return {};\n }\n return Object.fromEntries(Object.entries(camera).filter(([, value]) => value !== undefined));\n}\n\nfunction resolveBeat(beats, loopTimeMs) {\n let cursor = 0;\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n if (loopTimeMs < cursor + durationMs) {\n return { beat, beatTimeMs: loopTimeMs - cursor, durationMs };\n }\n cursor += durationMs;\n }\n const fallback = beats.at(-1);\n return { beat: fallback, beatTimeMs: fallback?.durationMs ?? 0, durationMs: fallback?.durationMs ?? 1 };\n}\n\nfunction resolveRoutePosition(route, timeMs) {\n if (!route.length) {\n return [0, 0, 0];\n }\n if (route.length === 1 || timeMs <= (route[0].arriveMs ?? 0)) {\n return [...route[0].position];\n }\n\n for (let index = 1; index < route.length; index += 1) {\n const previous = route[index - 1];\n const next = route[index];\n const start = previous.arriveMs ?? 0;\n const end = next.arriveMs ?? start + 1;\n if (timeMs <= end) {\n return lerp3(previous.position, next.position, clamp01((timeMs - start) / Math.max(1, end - start)));\n }\n }\n\n return [...route.at(-1).position];\n}\n\nfunction resolveRouteForward(route, timeMs) {\n if (route.length < 2) {\n return [0, 0, -1];\n }\n let previous = route[0];\n let next = route[1];\n for (let index = 1; index < route.length; index += 1) {\n next = route[index];\n if (timeMs <= (next.arriveMs ?? 0)) {\n previous = route[index - 1];\n break;\n }\n }\n return normalize3([\n (next.position?.[0] ?? 0) - (previous.position?.[0] ?? 0),\n (next.position?.[1] ?? 0) - (previous.position?.[1] ?? 0),\n (next.position?.[2] ?? 0) - (previous.position?.[2] ?? 0),\n ]);\n}\n\nfunction distance3(a = [0, 0, 0], b = [0, 0, 0]) {\n return Math.hypot(\n (b[0] ?? 0) - (a[0] ?? 0),\n (b[1] ?? 0) - (a[1] ?? 0),\n (b[2] ?? 0) - (a[2] ?? 0),\n );\n}\n\nfunction movementRequirementType(requirement, beat) {\n if (requirement?.type) {\n return requirement.type;\n }\n if (beat?.kind === \"locomotion\") {\n return beat?.rootMotion === \"in-place\" ? \"stationary\" : \"travel\";\n }\n if (beat?.kind === \"action\" || beat?.kind === \"idle\") {\n return \"stationary\";\n }\n const clipId = String(beat?.clipId ?? \"\").toLowerCase();\n if (/(idle|gesture|dig|plant|water|pick|serve|swing|fire|block|hoe)/iu.test(clipId)) {\n return \"stationary\";\n }\n if (/(walk|run|jump|climb|crawl|locomotion)/iu.test(clipId)) {\n return clipId.includes(\"jump\") ? \"jump\" : \"travel\";\n }\n return beat?.pathPointId ? \"travel\" : \"stationary\";\n}\n\nfunction movementDistancePerLoop(profile = {}) {\n profile ??= {};\n const rootDistance = Number(profile.rootTranslationDistance ?? profile.rootTranslation?.distance ?? 0);\n if (Number.isFinite(rootDistance) && rootDistance > 0) {\n return rootDistance;\n }\n const strideLength = Number(profile.strideLength ?? profile.strideLengthMeters ?? 0);\n if (Number.isFinite(strideLength) && strideLength > 0) {\n return strideLength;\n }\n return 0;\n}\n\nfunction clipDurationMs(profile = {}, fallbackMs = 1) {\n profile ??= {};\n const duration = Number(profile.durationMs ?? 0);\n return Number.isFinite(duration) && duration > 0 ? duration : Math.max(1, fallbackMs);\n}\n\nfunction profileAllowsDisplacement(profile = {}, movementType) {\n profile ??= {};\n if (movementType === \"stationary\") {\n return profile.worldDisplacementAllowed !== true;\n }\n return profile.worldDisplacementAllowed === true\n || profile.motionMode === \"root-authored\"\n || profile.motionMode === \"calibrated-in-place\"\n || profile.motionMode === \"jump\";\n}\n\nfunction resolveClipProfiles(clipAssets = []) {\n return new Map(clipAssets.map((clip) => [clip.id, clip.movementProfile ?? clip.profile ?? null]));\n}\n\nfunction buildBeatTimeline(beats, route, clipProfiles) {\n const routePoints = new Map(route.map((point) => [point.id, point]));\n let cursorMs = 0;\n let routeCursor = 0;\n let currentPosition = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n return beats.map((beat) => {\n const requirement = beat.movementRequirement ?? beat.movement ?? null;\n const movementType = movementRequirementType(requirement, beat);\n const movesThroughWorld = movementType === \"travel\" || movementType === \"jump\" || movementType === \"root-authored\";\n const explicitTargetPoint = beat.pathPointId ? routePoints.get(beat.pathPointId) : null;\n const inferredTargetPoint = movesThroughWorld ? route[Math.min(route.length - 1, routeCursor + 1)] : null;\n const targetPoint = explicitTargetPoint ?? inferredTargetPoint ?? null;\n const targetPosition = targetPoint?.position ? [...targetPoint.position] : [...currentPosition];\n const startPosition = [...currentPosition];\n const endPosition = movesThroughWorld ? targetPosition : [...currentPosition];\n const segmentDistance = Number(requirement?.distance ?? distance3(startPosition, endPosition));\n const profile = clipProfiles.get(beat.clipId) ?? null;\n const distancePerLoop = movementDistancePerLoop(profile);\n const loopCount = movesThroughWorld && distancePerLoop > 0\n ? Math.max(1, Math.ceil(segmentDistance / distancePerLoop))\n : 1;\n const derivedDurationMs = movesThroughWorld && distancePerLoop > 0\n ? loopCount * clipDurationMs(profile, beat.durationMs)\n : Math.max(1, beat.durationMs ?? 1);\n const durationMs = Math.max(1, beat.validatedDurationMs ?? requirement?.validatedDurationMs ?? derivedDurationMs);\n const expectedSpeed = Number(profile?.expectedSpeed ?? (durationMs > 0 ? segmentDistance / (durationMs / 1000) : 0));\n const actualSpeed = durationMs > 0 ? segmentDistance / (durationMs / 1000) : 0;\n const warnings = [];\n\n if (movesThroughWorld && !profileAllowsDisplacement(profile, movementType)) {\n warnings.push(`clip '${beat.clipId}' does not allow ${movementType} displacement`);\n }\n if (movesThroughWorld && distancePerLoop <= 0 && profile?.motionMode !== \"root-authored\") {\n warnings.push(`clip '${beat.clipId}' has no root or calibrated stride distance`);\n }\n if (movementType === \"stationary\" && profile?.worldDisplacementAllowed === true) {\n warnings.push(`stationary beat '${beat.id}' uses a displacement-capable clip`);\n }\n\n const entry = {\n beat,\n startMs: cursorMs,\n endMs: cursorMs + durationMs,\n durationMs,\n startPosition,\n endPosition,\n movementType,\n movementProfile: profile,\n movementDistance: segmentDistance,\n distancePerLoop,\n loopCount,\n expectedSpeed,\n actualSpeed,\n footSlideWarning: Number(profile?.footSlideTolerance ?? 0) < 0 ? \"invalid-foot-slide-tolerance\" : null,\n warnings,\n };\n\n cursorMs = entry.endMs;\n currentPosition = [...endPosition];\n if (targetPoint) {\n const nextRouteIndex = route.findIndex((point) => point.id === targetPoint.id);\n if (nextRouteIndex >= 0) {\n routeCursor = nextRouteIndex;\n }\n }\n return entry;\n });\n}\n\nfunction resolveTimelineBeat(timeline, loopTimeMs) {\n if (!timeline.length) {\n return null;\n }\n return timeline.find((entry) => loopTimeMs < entry.endMs) ?? timeline.at(-1);\n}\n\nfunction resolveTimelinePosition(entry, beatTimeMs) {\n if (!entry) {\n return [0, 0, 0];\n }\n if (entry.movementType !== \"travel\" && entry.movementType !== \"jump\" && entry.movementType !== \"root-authored\") {\n return [...entry.startPosition];\n }\n return lerp3(entry.startPosition, entry.endPosition, clamp01(beatTimeMs / Math.max(1, entry.durationMs)));\n}\n\nfunction resolveTimelineForward(entry) {\n if (!entry) {\n return [0, 0, -1];\n }\n return normalize3([\n (entry.endPosition[0] ?? 0) - (entry.startPosition[0] ?? 0),\n (entry.endPosition[1] ?? 0) - (entry.startPosition[1] ?? 0),\n (entry.endPosition[2] ?? 0) - (entry.startPosition[2] ?? 0),\n ]);\n}\n\nfunction resolveCameraViewMode(camera) {\n if (camera?.mode === \"lagged-follow\") {\n return camera.viewMode ?? \"spectator\";\n }\n return camera?.viewMode ?? camera?.mode ?? \"spectator\";\n}\n\nfunction resolveCanvas(canvas) {\n if (typeof canvas === \"string\") {\n const found = globalThis.document?.querySelector?.(canvas);\n if (!found) {\n throw new Error(`Animated scene canvas '${canvas}' was not found.`);\n }\n return found;\n }\n if (!canvas) {\n throw new Error(\"Animated scene renderer requires a canvas.\");\n }\n return canvas;\n}\n\nfunction project(position, cameraPosition, width, height) {\n const x = position[0] - cameraPosition[0];\n const depth = Math.max(0.2, cameraPosition[2] - (position[2] ?? 0));\n const scale = clamp(34 + 150 / (depth + 1.2), 34, 104);\n const groundY = height * 0.82 - depth * height * 0.045 - (position[1] ?? 0) * scale;\n return {\n x: width * 0.5 + x * scale,\n y: groundY,\n groundY,\n scale,\n depth,\n visible: groundY > -height * 0.2 && groundY < height * 1.18,\n };\n}\n\nfunction propIdentity(prop, index) {\n return prop.id ?? `${prop.kind}-${index}`;\n}\n\nfunction drawGroundShadow(ctx, scale) {\n ctx.fillStyle = \"rgba(44, 38, 28, 0.18)\";\n ctx.fillRect(-scale * 0.36, -scale * 0.035, scale * 0.72, scale * 0.07);\n}\n\nfunction drawProp(ctx, prop, cameraPosition, width, height) {\n const projected = project(prop.position, cameraPosition, width, height);\n const { x, y, scale } = projected;\n ctx.save();\n ctx.translate(x, y);\n ctx.lineWidth = Math.max(1, scale * 0.04);\n\n if (prop.kind === \"crop-row\") {\n ctx.fillStyle = \"#8b633f\";\n ctx.fillRect(-scale * 1.05, -scale * 0.08, scale * 2.1, scale * 0.16);\n ctx.fillStyle = \"#6f4a30\";\n ctx.fillRect(-scale * 0.92, -scale * 0.035, scale * 1.84, scale * 0.07);\n ctx.strokeStyle = \"#4f6f32\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.8, 0);\n ctx.lineTo(scale * 0.8, 0);\n ctx.stroke();\n ctx.fillStyle = \"#6f9f43\";\n for (let i = -3; i <= 3; i += 1) {\n ctx.fillRect(i * scale * 0.22, -scale * 0.18, scale * 0.06, scale * 0.2);\n }\n } else if (prop.kind === \"fence-segment\") {\n ctx.strokeStyle = \"#896b4d\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.5, 0);\n ctx.lineTo(scale * 0.5, 0);\n ctx.moveTo(-scale * 0.35, -scale * 0.25);\n ctx.lineTo(-scale * 0.35, scale * 0.1);\n ctx.moveTo(scale * 0.35, -scale * 0.25);\n ctx.lineTo(scale * 0.35, scale * 0.1);\n ctx.stroke();\n } else if (prop.kind === \"cart\") {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = \"#7b5238\";\n ctx.fillRect(-scale * 0.52, -scale * 0.38, scale * 1.04, scale * 0.36);\n ctx.fillStyle = \"#a4774c\";\n ctx.fillRect(-scale * 0.44, -scale * 0.32, scale * 0.88, scale * 0.08);\n ctx.fillStyle = \"#25201c\";\n ctx.beginPath();\n ctx.arc(-scale * 0.32, scale * 0.02, scale * 0.1, 0, Math.PI * 2);\n ctx.arc(scale * 0.32, scale * 0.02, scale * 0.1, 0, Math.PI * 2);\n ctx.fill();\n } else if (prop.kind === \"small-tree\") {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = \"#5b3b24\";\n ctx.fillRect(-scale * 0.07, -scale * 0.56, scale * 0.14, scale * 0.56);\n ctx.fillStyle = \"#2f6d3b\";\n ctx.beginPath();\n ctx.arc(-scale * 0.16, -scale * 0.72, scale * 0.25, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#3f8746\";\n ctx.beginPath();\n ctx.arc(scale * 0.13, -scale * 0.76, scale * 0.28, 0, Math.PI * 2);\n ctx.fill();\n ctx.fillStyle = \"#4f9a50\";\n ctx.beginPath();\n ctx.arc(0, -scale * 0.98, scale * 0.26, 0, Math.PI * 2);\n ctx.fill();\n } else {\n drawGroundShadow(ctx, scale);\n ctx.fillStyle = prop.kind === \"crate\" ? \"#9a6a3d\" : \"#d0c39f\";\n ctx.fillRect(-scale * 0.2, -scale * 0.32, scale * 0.4, scale * 0.32);\n if (prop.kind === \"crate\") {\n ctx.strokeStyle = \"#6e4829\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.2, -scale * 0.16);\n ctx.lineTo(scale * 0.2, -scale * 0.16);\n ctx.moveTo(0, -scale * 0.32);\n ctx.lineTo(0, 0);\n ctx.stroke();\n }\n }\n\n ctx.restore();\n return projected;\n}\n\nfunction drawCharacter(ctx, characterPosition, cameraPosition, width, height, gaitPhase, headLook) {\n const projected = project(characterPosition, cameraPosition, width, height);\n const { x, y, scale } = projected;\n const stride = Math.sin(gaitPhase * Math.PI * 2);\n const headYaw = (headLook?.yaw ?? 0) * (headLook?.weight ?? 0);\n ctx.save();\n ctx.translate(x, y);\n ctx.lineWidth = Math.max(2, scale * 0.05);\n ctx.lineCap = \"round\";\n\n drawGroundShadow(ctx, scale);\n\n ctx.strokeStyle = \"#4c2f25\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.12, -scale * 0.34);\n ctx.lineTo(-scale * (0.18 + stride * 0.04), -scale * 0.02);\n ctx.moveTo(scale * 0.12, -scale * 0.34);\n ctx.lineTo(scale * (0.18 - stride * 0.04), -scale * 0.02);\n ctx.stroke();\n\n ctx.fillStyle = \"#6f8f62\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.3, -scale * 0.86);\n ctx.lineTo(scale * 0.3, -scale * 0.86);\n ctx.lineTo(scale * 0.42, -scale * 0.24);\n ctx.lineTo(-scale * 0.42, -scale * 0.24);\n ctx.lineTo(-scale * 0.3, -scale * 0.86);\n ctx.fill();\n\n ctx.fillStyle = \"#d8b18c\";\n ctx.beginPath();\n ctx.arc(0, -scale * 1.16, scale * 0.18, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = \"#5a3a2b\";\n ctx.fillRect(-scale * 0.2, -scale * 1.28, scale * 0.4, scale * 0.16);\n ctx.fillRect(-scale * 0.23, -scale * 1.14, scale * 0.1, scale * 0.28);\n ctx.fillRect(scale * 0.13, -scale * 1.14, scale * 0.1, scale * 0.28);\n if (headLook?.status === \"active\" || headLook?.status === \"returning\") {\n ctx.strokeStyle = \"rgba(255, 246, 210, 0.74)\";\n ctx.lineWidth = Math.max(1, scale * 0.025);\n ctx.beginPath();\n ctx.moveTo(0, -scale * 1.16);\n ctx.lineTo(Math.sin(headYaw) * scale * 0.32, -scale * 1.16 - scale * 0.08);\n ctx.stroke();\n }\n\n ctx.strokeStyle = \"#6b4935\";\n ctx.beginPath();\n ctx.moveTo(-scale * 0.24, -scale * 0.76);\n ctx.lineTo(-scale * (0.46 + stride * 0.04), -scale * (0.5 + stride * 0.06));\n ctx.moveTo(scale * 0.24, -scale * 0.76);\n ctx.lineTo(scale * (0.46 - stride * 0.04), -scale * (0.5 - stride * 0.06));\n ctx.stroke();\n\n ctx.fillStyle = \"#d6c09a\";\n ctx.fillRect(-scale * 0.16, -scale * 0.86, scale * 0.32, scale * 0.18);\n ctx.restore();\n return projected;\n}\n\nfunction pointForModelVertex(vertex, projection, sample) {\n const bounds = sample.bounds;\n const height = Math.max(0.1, bounds.size[1] || sample.bindBounds.size[1] || 1);\n const modelScale = projection.scale * 1.3 / height;\n const centerX = (bounds.min[0] + bounds.max[0]) * 0.5;\n const centerZ = (bounds.min[2] + bounds.max[2]) * 0.5;\n return [\n projection.x + (vertex[0] - centerX) * modelScale,\n projection.groundY - (vertex[1] - bounds.min[1]) * modelScale + (vertex[2] - centerZ) * modelScale * 0.16,\n ];\n}\n\nfunction modelFillForHeight(vertex, sample) {\n const height = Math.max(0.1, sample.bounds.size[1] || 1);\n const t = (vertex[1] - sample.bounds.min[1]) / height;\n if (t > 0.82) {\n return \"#6d4a36\";\n }\n if (t > 0.58) {\n return \"#d7b28f\";\n }\n if (t > 0.25) {\n return \"#6f8f62\";\n }\n return \"#5e4636\";\n}\n\nfunction drawSkinnedGltfCharacter(ctx, model, snapshot, width, height) {\n const projection = project(snapshot.characterPosition, snapshot.cameraPosition, width, height);\n const sample = model.sample(snapshot.activeClipId, snapshot.clipTimeMs);\n const maxTriangles = 12000;\n const triangleCount = Math.floor(sample.indices.length / 3);\n const stride = Math.max(1, Math.ceil(triangleCount / maxTriangles));\n const triangles = [];\n for (let triangleIndex = 0; triangleIndex < triangleCount; triangleIndex += stride) {\n const base = triangleIndex * 3;\n const a = sample.vertices[sample.indices[base]];\n const b = sample.vertices[sample.indices[base + 1]];\n const c = sample.vertices[sample.indices[base + 2]];\n if (!a || !b || !c) {\n continue;\n }\n triangles.push({\n a,\n b,\n c,\n depth: (a[2] + b[2] + c[2]) / 3,\n fill: modelFillForHeight(a, sample),\n });\n }\n triangles.sort((left, right) => left.depth - right.depth);\n\n ctx.save();\n drawGroundShadow(ctx, projection.scale);\n for (const triangle of triangles) {\n const [ax, ay] = pointForModelVertex(triangle.a, projection, sample);\n const [bx, by] = pointForModelVertex(triangle.b, projection, sample);\n const [cx, cy] = pointForModelVertex(triangle.c, projection, sample);\n ctx.fillStyle = triangle.fill;\n ctx.beginPath();\n ctx.moveTo(ax, ay);\n ctx.lineTo(bx, by);\n ctx.lineTo(cx, cy);\n ctx.closePath?.();\n ctx.fill();\n }\n ctx.restore();\n\n return {\n projection,\n sample,\n };\n}\n\nfunction renderScene(canvas, ctx, snapshot, props, characterModel) {\n const width = canvas.width || 1;\n const height = canvas.height || 1;\n ctx.clearRect(0, 0, width, height);\n ctx.fillStyle = \"#d8e8d0\";\n ctx.fillRect(0, 0, width, height);\n ctx.fillStyle = \"#9fc47a\";\n ctx.fillRect(0, height * 0.52, width, height * 0.48);\n ctx.strokeStyle = \"#caa66d\";\n ctx.lineWidth = Math.max(2, width * 0.006);\n ctx.beginPath();\n ctx.moveTo(width * 0.35, height);\n ctx.quadraticCurveTo(width * 0.53, height * 0.58, width * 0.62, 0);\n ctx.stroke();\n\n const projectedProps = props\n .map((prop, index) => ({\n prop,\n id: propIdentity(prop, index),\n projected: project(prop.position, snapshot.cameraPosition, width, height),\n }))\n .sort((a, b) => b.projected.depth - a.projected.depth);\n\n const propGroundAnchors = [];\n for (const { prop, id } of projectedProps) {\n const projected = drawProp(ctx, prop, snapshot.cameraPosition, width, height);\n propGroundAnchors.push({\n id,\n kind: prop.kind,\n groundY: projected.groundY,\n depth: projected.depth,\n visible: projected.visible,\n });\n }\n let characterProjection;\n let modelRenderable = false;\n let fallbackProxyActive = true;\n let skinnedVertexCount = 0;\n let skinnedTriangleCount = 0;\n let skinnedJointCount = 0;\n let skinnedAnimatedNodeCount = 0;\n let skinnedClipCount = 0;\n let activeClipRenderable = false;\n\n if (characterModel) {\n const drawn = drawSkinnedGltfCharacter(ctx, characterModel, snapshot, width, height);\n characterProjection = drawn.projection;\n modelRenderable = true;\n fallbackProxyActive = false;\n skinnedVertexCount = characterModel.vertexCount;\n skinnedTriangleCount = characterModel.triangleCount;\n skinnedJointCount = characterModel.jointCount;\n skinnedAnimatedNodeCount = characterModel.animatedNodeCount;\n skinnedClipCount = characterModel.clipCount;\n activeClipRenderable = drawn.sample.activeClipRenderable;\n } else {\n characterProjection = drawCharacter(\n ctx,\n snapshot.characterPosition,\n snapshot.cameraPosition,\n width,\n height,\n snapshot.clipTimeMs / 900,\n snapshot.headLook,\n );\n }\n\n return {\n characterGroundY: characterProjection.groundY,\n characterVisible: characterProjection.visible,\n modelLoaded: Boolean(characterModel),\n modelRenderable,\n fallbackProxyActive,\n skinnedVertexCount,\n skinnedTriangleCount,\n skinnedJointCount,\n skinnedAnimatedNodeCount,\n skinnedClipCount,\n activeClipRenderable,\n propGroundAnchors,\n };\n}\n\nfunction resolveCharacterModel(options) {\n try {\n return createAnimatedGltfModel(\n options.modelAsset ?? options.animationAdventure?.modelAsset,\n options.clipAssets ?? options.animationAdventure?.clipAssets ?? [],\n );\n } catch {\n return null;\n }\n}\n\nexport function createAnimatedSceneRenderer(options = {}) {\n const canvas = resolveCanvas(options.canvas);\n const ctx = canvas.getContext?.(\"2d\");\n if (!ctx) {\n throw new Error(\"Animated scene renderer requires a 2D canvas context.\");\n }\n\n const route = [...(options.route ?? options.animationAdventure?.route ?? [])];\n const beats = [...(options.beats ?? options.animationAdventure?.beats ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n const props = [...(options.props ?? options.animationAdventure?.props ?? [])];\n const clipAssets = options.clipAssets ?? options.animationAdventure?.clipAssets ?? [];\n const clipProfiles = resolveClipProfiles(clipAssets);\n const beatTimeline = buildBeatTimeline(beats, route, clipProfiles);\n const characterModel = resolveCharacterModel(options);\n let camera = {\n ...DEFAULT_CAMERA,\n ...definedCameraOverrides(options.camera ?? options.animationAdventure?.camera),\n };\n const loopDurationMs = Math.max(beatTimeline.at(-1)?.endMs ?? durationFromBeats(beats), 1);\n const movementWarnings = beatTimeline.flatMap((entry) => entry.warnings);\n const requestFrame = options.requestAnimationFrame ?? globalThis.requestAnimationFrame?.bind(globalThis);\n const cancelFrame = options.cancelAnimationFrame ?? globalThis.cancelAnimationFrame?.bind(globalThis);\n let frameHandle;\n let running = false;\n let frame = 0;\n let startedAtMs;\n let lastTimestamp;\n let pendingCameraControl = null;\n let activeCameraControl = false;\n let headLookWeight = 0;\n let cameraPosition = route[0]\n ? [\n route[0].position[0] + (camera.offset?.[0] ?? 0),\n route[0].position[1] + (camera.offset?.[1] ?? 0),\n route[0].position[2] + (camera.offset?.[2] ?? 0),\n ]\n : [0, 2.4, 5.5];\n let cameraRigFrame = resolveCameraRigFrame({\n viewMode: \"editor\",\n anchors: {\n target: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n head: route[0]?.position ? [route[0].position[0], route[0].position[1] + 1.65, route[0].position[2]] : [0, 1.65, 0],\n forward: [0, 0, -1],\n },\n camera: {\n id: \"animation-adventure\",\n transform: {\n position: [...cameraPosition],\n target: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n },\n },\n constraints: camera.constraints,\n });\n let snapshot = {\n frame,\n running,\n activeClipId: beats[0]?.clipId ?? \"\",\n activeBeatId: beats[0]?.id ?? \"\",\n activeMovementMode: beatTimeline[0]?.movementType ?? \"stationary\",\n blendProgress: 0,\n clipTimeMs: 0,\n characterPosition: route[0]?.position ? [...route[0].position] : [0, 0, 0],\n cameraPosition: [...cameraPosition],\n cameraViewMode: resolveCameraViewMode(camera),\n cameraTransform: cameraRigFrame.transform,\n targetDistance: cameraRigFrame.targetDistance,\n headLook: cameraRigFrame.headLook,\n characterGroundY: 0,\n characterVisible: false,\n modelLoaded: Boolean(characterModel),\n modelRenderable: false,\n fallbackProxyActive: true,\n skinnedVertexCount: characterModel?.vertexCount ?? 0,\n skinnedTriangleCount: characterModel?.triangleCount ?? 0,\n skinnedJointCount: characterModel?.jointCount ?? 0,\n skinnedAnimatedNodeCount: characterModel?.animatedNodeCount ?? 0,\n skinnedClipCount: characterModel?.clipCount ?? 0,\n activeClipRenderable: false,\n propGroundAnchors: [],\n movementValidation: {\n status: movementWarnings.length ? \"warning\" : \"passed\",\n warnings: movementWarnings,\n activeBeatId: beats[0]?.id ?? \"\",\n activeClipId: beats[0]?.clipId ?? \"\",\n motionMode: beatTimeline[0]?.movementType ?? \"stationary\",\n rootMotionSource: beatTimeline[0]?.movementProfile?.motionMode ?? \"none\",\n expectedSpeed: beatTimeline[0]?.expectedSpeed ?? 0,\n actualSpeed: beatTimeline[0]?.actualSpeed ?? 0,\n movementDistance: beatTimeline[0]?.movementDistance ?? 0,\n loopCount: beatTimeline[0]?.loopCount ?? 1,\n footSlideWarning: beatTimeline[0]?.footSlideWarning ?? null,\n },\n frameState: \"initialized\",\n };\n\n function renderOnce(timestamp = nowMs()) {\n if (startedAtMs === undefined) {\n startedAtMs = timestamp;\n }\n const elapsedMs = Math.max(0, timestamp - startedAtMs);\n const loopTimeMs = elapsedMs % loopDurationMs;\n const frameTimeMs = lastTimestamp === undefined ? 16.67 : Math.max(0, timestamp - lastTimestamp);\n lastTimestamp = timestamp;\n frame += 1;\n\n const timelineEntry = resolveTimelineBeat(beatTimeline, loopTimeMs);\n const fallbackBeat = resolveBeat(beats, loopTimeMs);\n const beat = timelineEntry?.beat ?? fallbackBeat.beat;\n const beatTimeMs = timelineEntry ? loopTimeMs - timelineEntry.startMs : fallbackBeat.beatTimeMs;\n const durationMs = timelineEntry?.durationMs ?? fallbackBeat.durationMs;\n const blend = beat?.blend ?? { inMs: 0, outMs: 0 };\n const blendIn = blend.inMs > 0 ? clamp01(beatTimeMs / blend.inMs) : 1;\n const blendOut = blend.outMs > 0 ? clamp01((durationMs - beatTimeMs) / blend.outMs) : 1;\n const blendProgress = clamp01(Math.min(blendIn, blendOut));\n const characterPosition = timelineEntry\n ? resolveTimelinePosition(timelineEntry, beatTimeMs)\n : resolveRoutePosition(route, loopTimeMs);\n const characterForward = timelineEntry ? resolveTimelineForward(timelineEntry) : resolveRouteForward(route, loopTimeMs);\n const headAnchor =\n camera.headBoneAvailable === false\n ? undefined\n : [\n characterPosition[0],\n characterPosition[1] + (camera.headHeight ?? 1.65),\n characterPosition[2],\n ];\n const lookAheadTimeMs = (loopTimeMs + camera.lookAheadMs) % loopDurationMs;\n const lookAheadEntry = resolveTimelineBeat(beatTimeline, lookAheadTimeMs);\n const lookAheadPosition = lookAheadEntry\n ? resolveTimelinePosition(lookAheadEntry, lookAheadTimeMs - lookAheadEntry.startMs)\n : resolveRoutePosition(route, lookAheadTimeMs);\n const desiredCamera = [\n lookAheadPosition[0] + (camera.offset?.[0] ?? 0),\n lookAheadPosition[1] + (camera.offset?.[1] ?? 0),\n lookAheadPosition[2] + (camera.offset?.[2] ?? 0),\n ];\n const smoothing = bezierY(camera.cubicBezier, clamp01(frameTimeMs / Math.max(1, camera.lagMs)));\n cameraPosition = lerp3(cameraPosition, desiredCamera, smoothing);\n const cameraViewMode = resolveCameraViewMode(camera);\n const rigViewMode = cameraViewMode === \"spectator\" ? \"editor\" : cameraViewMode;\n cameraRigFrame = resolveCameraRigFrame({\n viewMode: rigViewMode,\n anchors: {\n target: characterPosition,\n ...(headAnchor ? { head: headAnchor } : {}),\n forward: characterForward,\n },\n camera: {\n id: \"animation-adventure\",\n transform: {\n position: [...cameraPosition],\n target: lookAheadPosition,\n },\n },\n constraints: camera.constraints,\n control: pendingCameraControl,\n activeControl: activeCameraControl,\n });\n\n if (activeCameraControl && cameraRigFrame.headLook.status === \"active\") {\n headLookWeight = cameraRigFrame.headLook.weight;\n } else {\n const returnMs = Math.max(1, camera.headLook?.returnMs ?? DEFAULT_CAMERA.headLook.returnMs);\n headLookWeight = lerp(headLookWeight, 0, clamp01(frameTimeMs / returnMs));\n }\n const headLook = {\n ...cameraRigFrame.headLook,\n status:\n cameraRigFrame.headLook.status === \"unavailable\"\n ? \"unavailable\"\n : headLookWeight > 0.001 && !activeCameraControl\n ? \"returning\"\n : cameraRigFrame.headLook.status,\n weight: headLookWeight,\n };\n cameraPosition = [...cameraRigFrame.transform.position];\n pendingCameraControl = null;\n activeCameraControl = false;\n\n snapshot = {\n frame,\n running,\n activeClipId: beat?.clipId ?? \"\",\n activeBeatId: beat?.id ?? \"\",\n activeMovementMode: timelineEntry?.movementType ?? \"stationary\",\n blendProgress,\n clipTimeMs: beatTimeMs,\n characterPosition,\n cameraPosition: [...cameraPosition],\n cameraViewMode,\n cameraTransform: cameraRigFrame.transform,\n targetDistance: cameraRigFrame.targetDistance,\n headLook,\n characterGroundY: 0,\n characterVisible: false,\n modelLoaded: Boolean(characterModel),\n modelRenderable: false,\n fallbackProxyActive: true,\n skinnedVertexCount: characterModel?.vertexCount ?? 0,\n skinnedTriangleCount: characterModel?.triangleCount ?? 0,\n skinnedJointCount: characterModel?.jointCount ?? 0,\n skinnedAnimatedNodeCount: characterModel?.animatedNodeCount ?? 0,\n skinnedClipCount: characterModel?.clipCount ?? 0,\n activeClipRenderable: false,\n propGroundAnchors: [],\n movementValidation: {\n status: movementWarnings.length ? \"warning\" : \"passed\",\n warnings: [...movementWarnings],\n activeBeatId: beat?.id ?? \"\",\n activeClipId: beat?.clipId ?? \"\",\n motionMode: timelineEntry?.movementType ?? \"stationary\",\n rootMotionSource: timelineEntry?.movementProfile?.motionMode ?? \"none\",\n expectedSpeed: timelineEntry?.expectedSpeed ?? 0,\n actualSpeed: timelineEntry?.actualSpeed ?? 0,\n movementDistance: timelineEntry?.movementDistance ?? 0,\n loopCount: timelineEntry?.loopCount ?? 1,\n footSlideWarning: timelineEntry?.footSlideWarning ?? null,\n },\n frameState: running ? \"running\" : \"rendered-once\",\n };\n\n const visibility = renderScene(canvas, ctx, snapshot, props, characterModel);\n snapshot = {\n ...snapshot,\n ...visibility,\n };\n return snapshot;\n }\n\n function tick(timestamp) {\n if (!running) {\n return;\n }\n renderOnce(timestamp);\n if (running && requestFrame) {\n frameHandle = requestFrame(tick);\n }\n }\n\n return {\n start() {\n if (running) {\n return;\n }\n running = true;\n snapshot = { ...snapshot, running: true, frameState: \"running\" };\n if (requestFrame) {\n frameHandle = requestFrame(tick);\n } else {\n renderOnce();\n }\n },\n resize(width, height, devicePixelRatio = 1) {\n const ratio = Number.isFinite(devicePixelRatio) && devicePixelRatio > 0 ? devicePixelRatio : 1;\n canvas.width = Math.max(1, Math.floor(width * ratio));\n canvas.height = Math.max(1, Math.floor(height * ratio));\n if (canvas.style) {\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n const visibility = renderScene(canvas, ctx, snapshot, props, characterModel);\n snapshot = {\n ...snapshot,\n ...visibility,\n };\n },\n renderOnce,\n getSnapshot() {\n return {\n ...snapshot,\n characterPosition: [...snapshot.characterPosition],\n cameraPosition: [...snapshot.cameraPosition],\n cameraTransform: {\n position: [...snapshot.cameraTransform.position],\n target: [...snapshot.cameraTransform.target],\n up: [...snapshot.cameraTransform.up],\n },\n headLook: {\n ...snapshot.headLook,\n target: [...snapshot.headLook.target],\n },\n movementValidation: {\n ...snapshot.movementValidation,\n warnings: [...(snapshot.movementValidation?.warnings ?? [])],\n },\n propGroundAnchors: snapshot.propGroundAnchors.map((anchor) => ({ ...anchor })),\n };\n },\n setCamera(nextCamera = {}) {\n camera = { ...camera, ...nextCamera };\n snapshot = {\n ...snapshot,\n cameraViewMode: resolveCameraViewMode(camera),\n };\n },\n setCameraViewMode(viewMode) {\n camera = { ...camera, viewMode };\n snapshot = {\n ...snapshot,\n cameraViewMode: resolveCameraViewMode(camera),\n };\n },\n applyCameraControl(control, options = {}) {\n pendingCameraControl = control;\n activeCameraControl = options.activeControl !== false;\n },\n destroy() {\n running = false;\n if (frameHandle !== undefined && cancelFrame) {\n cancelFrame(frameHandle);\n }\n frameHandle = undefined;\n snapshot = { ...snapshot, running: false, frameState: \"destroyed\" };\n },\n };\n}\n","const GLB_MAGIC = 0x46546c67;\nconst GLB_VERSION = 2;\nconst GLB_JSON_CHUNK = 0x4e4f534a;\nconst GLB_BIN_CHUNK = 0x004e4942;\n\nconst COMPONENT_READERS = Object.freeze({\n 5120: { size: 1, read: (view, offset) => view.getInt8(offset), normalizedDivisor: 127 },\n 5121: { size: 1, read: (view, offset) => view.getUint8(offset), normalizedDivisor: 255 },\n 5122: { size: 2, read: (view, offset) => view.getInt16(offset, true), normalizedDivisor: 32767 },\n 5123: { size: 2, read: (view, offset) => view.getUint16(offset, true), normalizedDivisor: 65535 },\n 5125: { size: 4, read: (view, offset) => view.getUint32(offset, true), normalizedDivisor: 4294967295 },\n 5126: { size: 4, read: (view, offset) => view.getFloat32(offset, true), normalizedDivisor: 1 },\n});\n\nconst ACCESSOR_COMPONENTS = Object.freeze({\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT4: 16,\n});\n\nfunction identityMatrix() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nfunction multiplyMatrix(a, b) {\n const out = new Array(16).fill(0);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n out[column * 4 + row] =\n a[0 * 4 + row] * b[column * 4 + 0]\n + a[1 * 4 + row] * b[column * 4 + 1]\n + a[2 * 4 + row] * b[column * 4 + 2]\n + a[3 * 4 + row] * b[column * 4 + 3];\n }\n }\n return out;\n}\n\nfunction transformPoint(matrix, point) {\n const [x, y, z] = point;\n return [\n matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12],\n matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13],\n matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14],\n ];\n}\n\nfunction composeMatrix(translation = [0, 0, 0], rotation = [0, 0, 0, 1], scale = [1, 1, 1]) {\n const [x, y, z, w] = normalizeQuaternion(rotation);\n const [sx, sy, sz] = scale;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n return [\n (1 - (yy + zz)) * sx,\n (xy + wz) * sx,\n (xz - wy) * sx,\n 0,\n (xy - wz) * sy,\n (1 - (xx + zz)) * sy,\n (yz + wx) * sy,\n 0,\n (xz + wy) * sz,\n (yz - wx) * sz,\n (1 - (xx + yy)) * sz,\n 0,\n translation[0] ?? 0,\n translation[1] ?? 0,\n translation[2] ?? 0,\n 1,\n ];\n}\n\nfunction normalizeQuaternion(quaternion = [0, 0, 0, 1]) {\n const length = Math.hypot(quaternion[0] ?? 0, quaternion[1] ?? 0, quaternion[2] ?? 0, quaternion[3] ?? 1) || 1;\n return [\n (quaternion[0] ?? 0) / length,\n (quaternion[1] ?? 0) / length,\n (quaternion[2] ?? 0) / length,\n (quaternion[3] ?? 1) / length,\n ];\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerpArray(a, b, t) {\n return a.map((value, index) => lerp(value, b[index] ?? value, t));\n}\n\nfunction nlerpQuaternion(a, b, t) {\n let end = b;\n const dot = a.reduce((total, value, index) => total + value * (b[index] ?? 0), 0);\n if (dot < 0) {\n end = b.map((value) => -value);\n }\n return normalizeQuaternion(lerpArray(a, end, t));\n}\n\nfunction parseGlb(buffer) {\n if (!(buffer instanceof ArrayBuffer)) {\n return null;\n }\n const view = new DataView(buffer);\n if (view.byteLength < 20 || view.getUint32(0, true) !== GLB_MAGIC || view.getUint32(4, true) !== GLB_VERSION) {\n return null;\n }\n\n let offset = 12;\n let json = null;\n let binary = null;\n while (offset + 8 <= view.byteLength) {\n const length = view.getUint32(offset, true);\n const type = view.getUint32(offset + 4, true);\n const start = offset + 8;\n const end = start + length;\n if (end > view.byteLength) {\n return null;\n }\n if (type === GLB_JSON_CHUNK) {\n const text = new TextDecoder().decode(new Uint8Array(buffer, start, length)).trim();\n json = JSON.parse(text);\n } else if (type === GLB_BIN_CHUNK) {\n binary = new Uint8Array(buffer, start, length);\n }\n offset = end;\n }\n\n if (!json || !binary) {\n return null;\n }\n return { json, binary };\n}\n\nfunction readAccessor(document, accessorIndex) {\n const accessor = document.json.accessors?.[accessorIndex];\n if (!accessor) {\n return [];\n }\n const bufferView = document.json.bufferViews?.[accessor.bufferView];\n const component = COMPONENT_READERS[accessor.componentType];\n const componentCount = ACCESSOR_COMPONENTS[accessor.type] ?? 1;\n if (!bufferView || !component) {\n return [];\n }\n\n const view = new DataView(\n document.binary.buffer,\n document.binary.byteOffset + (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0),\n bufferView.byteLength ?? 0,\n );\n const stride = bufferView.byteStride ?? component.size * componentCount;\n const values = [];\n for (let index = 0; index < accessor.count; index += 1) {\n const item = [];\n const baseOffset = index * stride;\n for (let componentIndex = 0; componentIndex < componentCount; componentIndex += 1) {\n const raw = component.read(view, baseOffset + componentIndex * component.size);\n item.push(accessor.normalized && accessor.componentType !== 5126 ? raw / component.normalizedDivisor : raw);\n }\n values.push(componentCount === 1 ? item[0] : item);\n }\n return values;\n}\n\nfunction readMatrices(document, accessorIndex) {\n return readAccessor(document, accessorIndex).map((matrix) => Array.from(matrix));\n}\n\nfunction textureImage(document, textureIndex) {\n if (typeof textureIndex !== \"number\") {\n return null;\n }\n const texture = document.json.textures?.[textureIndex];\n return typeof texture?.source === \"number\" ? document.json.images?.[texture.source] ?? null : null;\n}\n\nfunction imageHasBuffer(document, image) {\n if (!image) {\n return false;\n }\n if (typeof image.uri === \"string\" && image.uri.trim().length > 0) {\n return true;\n }\n return typeof image.bufferView === \"number\" && Boolean(document.json.bufferViews?.[image.bufferView]);\n}\n\nfunction extractMaterialTextureMetadata(document, primitive) {\n const material = document.json.materials?.[primitive?.material];\n const baseColorTextureIndex = material?.pbrMetallicRoughness?.baseColorTexture?.index;\n const normalTextureIndex = material?.normalTexture?.index;\n const missingTextureReferences = [];\n if (typeof baseColorTextureIndex === \"number\" && !imageHasBuffer(document, textureImage(document, baseColorTextureIndex))) {\n missingTextureReferences.push(\"baseColorTexture\");\n }\n if (typeof normalTextureIndex === \"number\" && !imageHasBuffer(document, textureImage(document, normalTextureIndex))) {\n missingTextureReferences.push(\"normalTexture\");\n }\n\n return Object.freeze({\n materialCount: document.json.materials?.length ?? 0,\n textureCount: document.json.textures?.length ?? 0,\n imageCount: document.json.images?.length ?? 0,\n embeddedImageCount: (document.json.images ?? []).filter((image) => typeof image.bufferView === \"number\").length,\n baseColorTextureCount: typeof baseColorTextureIndex === \"number\" ? 1 : 0,\n normalTextureCount: typeof normalTextureIndex === \"number\" ? 1 : 0,\n hasBaseColorTexture: typeof baseColorTextureIndex === \"number\",\n hasNormalTexture: typeof normalTextureIndex === \"number\",\n missingTextureReferences: Object.freeze(missingTextureReferences),\n materialName: material?.name ?? \"\",\n });\n}\n\nfunction nodeLocalMatrix(node, override = {}) {\n if (node.matrix && !override.translation && !override.rotation && !override.scale) {\n return [...node.matrix];\n }\n return composeMatrix(\n override.translation ?? node.translation ?? [0, 0, 0],\n override.rotation ?? node.rotation ?? [0, 0, 0, 1],\n override.scale ?? node.scale ?? [1, 1, 1],\n );\n}\n\nfunction computeWorldMatrices(nodes, overridesByName = new Map()) {\n const parents = new Set();\n for (const node of nodes) {\n for (const child of node.children ?? []) {\n parents.add(child);\n }\n }\n const roots = nodes\n .map((_, index) => index)\n .filter((index) => !parents.has(index));\n const worldMatrices = nodes.map(() => identityMatrix());\n\n function visit(nodeIndex, parentMatrix) {\n const node = nodes[nodeIndex];\n if (!node) {\n return;\n }\n const worldMatrix = multiplyMatrix(parentMatrix, nodeLocalMatrix(node, overridesByName.get(node.name) ?? {}));\n worldMatrices[nodeIndex] = worldMatrix;\n for (const child of node.children ?? []) {\n visit(child, worldMatrix);\n }\n }\n\n for (const root of roots) {\n visit(root, identityMatrix());\n }\n return worldMatrices;\n}\n\nfunction normalizeWeights(weights) {\n const total = weights.reduce((sum, value) => sum + Math.max(0, value), 0);\n if (total <= 0) {\n return [1, 0, 0, 0];\n }\n return weights.map((value) => Math.max(0, value) / total);\n}\n\nfunction deriveBounds(vertices) {\n const min = [Infinity, Infinity, Infinity];\n const max = [-Infinity, -Infinity, -Infinity];\n for (const vertex of vertices) {\n for (let axis = 0; axis < 3; axis += 1) {\n min[axis] = Math.min(min[axis], vertex[axis]);\n max[axis] = Math.max(max[axis], vertex[axis]);\n }\n }\n if (!Number.isFinite(min[0])) {\n return { min: [0, 0, 0], max: [0, 1, 0], size: [1, 1, 1] };\n }\n return {\n min,\n max,\n size: [max[0] - min[0], max[1] - min[1], max[2] - min[2]],\n };\n}\n\nfunction sampleChannel(channel, sampler, document, timeSeconds) {\n const input = readAccessor(document, sampler.input);\n const output = readAccessor(document, sampler.output);\n if (!input.length || !output.length) {\n return null;\n }\n const duration = input.at(-1) || 0;\n const sampleTime = duration > 0 ? timeSeconds % duration : 0;\n let frame = 0;\n while (frame < input.length - 2 && sampleTime > input[frame + 1]) {\n frame += 1;\n }\n const start = input[frame] ?? 0;\n const end = input[frame + 1] ?? start;\n const t = end > start ? (sampleTime - start) / (end - start) : 0;\n const startValue = Array.isArray(output[frame]) ? output[frame] : [output[frame] ?? 0];\n const endValue = Array.isArray(output[frame + 1]) ? output[frame + 1] : startValue;\n return channel.target.path === \"rotation\"\n ? nlerpQuaternion(startValue, endValue, t)\n : lerpArray(startValue, endValue, t);\n}\n\nfunction rootTranslationDistance(clipPayload) {\n if (!clipPayload) {\n return 0;\n }\n let distance = 0;\n for (const channel of clipPayload.animation.channels ?? []) {\n if (channel.target?.path !== \"translation\") {\n continue;\n }\n const nodeName = clipPayload.document.json.nodes?.[channel.target.node]?.name ?? \"\";\n if (!/(^|:)Hips$/u.test(nodeName) && nodeName !== \"mixamorigHips\") {\n continue;\n }\n const sampler = clipPayload.animation.samplers?.[channel.sampler];\n const output = sampler ? readAccessor(clipPayload.document, sampler.output) : [];\n if (output.length < 2) {\n continue;\n }\n const start = Array.isArray(output[0]) ? output[0] : [0, 0, 0];\n const end = Array.isArray(output.at(-1)) ? output.at(-1) : start;\n distance = Math.max(distance, Math.hypot((end[0] ?? 0) - (start[0] ?? 0), (end[2] ?? 0) - (start[2] ?? 0)));\n }\n return distance;\n}\n\nfunction createClipPayload(clipRef) {\n const document = parseGlb(clipRef?.asset);\n const animation = document?.json.animations?.[0];\n if (!document || !animation) {\n return null;\n }\n const nodeNames = new Set();\n let durationSeconds = 0;\n for (const channel of animation.channels ?? []) {\n const nodeName = document.json.nodes?.[channel.target?.node]?.name;\n if (nodeName) {\n nodeNames.add(nodeName);\n }\n const sampler = animation.samplers?.[channel.sampler];\n const input = sampler ? readAccessor(document, sampler.input) : [];\n durationSeconds = Math.max(durationSeconds, input.at(-1) ?? 0);\n }\n return {\n id: clipRef.id,\n document,\n animation,\n durationSeconds,\n nodeNames,\n };\n}\n\nfunction sampleClipOverrides(clipPayload, timeSeconds) {\n const overrides = new Map();\n if (!clipPayload) {\n return overrides;\n }\n for (const channel of clipPayload.animation.channels ?? []) {\n const targetNode = clipPayload.document.json.nodes?.[channel.target?.node];\n const sampler = clipPayload.animation.samplers?.[channel.sampler];\n if (!targetNode?.name || !sampler) {\n continue;\n }\n const value = sampleChannel(channel, sampler, clipPayload.document, timeSeconds);\n if (!value) {\n continue;\n }\n const existing = overrides.get(targetNode.name) ?? {};\n overrides.set(targetNode.name, {\n ...existing,\n [channel.target.path]: value,\n });\n }\n return overrides;\n}\n\nexport function createAnimatedGltfModel(modelAsset, clipRefs = []) {\n const document = parseGlb(modelAsset);\n if (!document) {\n return null;\n }\n\n const nodes = document.json.nodes ?? [];\n const meshNodeIndex = nodes.findIndex((node) => node.mesh !== undefined && node.skin !== undefined);\n const meshNode = nodes[meshNodeIndex];\n const mesh = document.json.meshes?.[meshNode?.mesh];\n const primitive = mesh?.primitives?.find((candidate) => candidate.attributes?.POSITION !== undefined);\n const skin = document.json.skins?.[meshNode?.skin];\n if (!meshNode || !primitive || !skin) {\n return null;\n }\n\n const positions = readAccessor(document, primitive.attributes.POSITION);\n const normals = primitive.attributes.NORMAL === undefined\n ? []\n : readAccessor(document, primitive.attributes.NORMAL);\n const texcoords = primitive.attributes.TEXCOORD_0 === undefined\n ? []\n : readAccessor(document, primitive.attributes.TEXCOORD_0);\n const joints = primitive.attributes.JOINTS_0 === undefined\n ? positions.map(() => [0, 0, 0, 0])\n : readAccessor(document, primitive.attributes.JOINTS_0);\n const weights = primitive.attributes.WEIGHTS_0 === undefined\n ? positions.map(() => [1, 0, 0, 0])\n : readAccessor(document, primitive.attributes.WEIGHTS_0).map(normalizeWeights);\n const indices = primitive.indices === undefined\n ? positions.map((_, index) => index)\n : readAccessor(document, primitive.indices);\n const inverseBindMatrices = skin.inverseBindMatrices === undefined\n ? skin.joints.map(() => identityMatrix())\n : readMatrices(document, skin.inverseBindMatrices);\n const clips = clipRefs.map(createClipPayload).filter(Boolean);\n const bindWorldMatrices = computeWorldMatrices(nodes);\n const bindVertices = skinVertices({\n positions,\n joints,\n weights,\n skin,\n inverseBindMatrices,\n worldMatrices: bindWorldMatrices,\n });\n const bounds = deriveBounds(bindVertices);\n const materialTextureMetadata = extractMaterialTextureMetadata(document, primitive);\n const clipRootMotionDistances = new Map(clips.map((clip) => [clip.id, rootTranslationDistance(clip)]));\n\n return {\n name: mesh.name ?? meshNode.name ?? \"skinned-gltf-model\",\n vertexCount: positions.length,\n triangleCount: Math.floor(indices.length / 3),\n jointCount: skin.joints.length,\n animatedNodeCount: new Set(clips.flatMap((clip) => [...clip.nodeNames])).size,\n clipCount: clips.length,\n materialTextureMetadata,\n textureCount: materialTextureMetadata.textureCount,\n materialCount: materialTextureMetadata.materialCount,\n hasBaseColorTexture: materialTextureMetadata.hasBaseColorTexture,\n hasNormalTexture: materialTextureMetadata.hasNormalTexture,\n hasUv: texcoords.length === positions.length,\n hasNormals: normals.length === positions.length,\n professionalRenderable:\n materialTextureMetadata.hasBaseColorTexture\n && materialTextureMetadata.hasNormalTexture\n && materialTextureMetadata.missingTextureReferences.length === 0\n && texcoords.length === positions.length\n && normals.length === positions.length\n && skin.joints.length > 0,\n clips,\n sample(activeClipId, clipTimeMs) {\n const clip = clips.find((candidate) => candidate.id === activeClipId) ?? clips[0] ?? null;\n const overrides = sampleClipOverrides(clip, Math.max(0, clipTimeMs) / 1000);\n const worldMatrices = computeWorldMatrices(nodes, overrides);\n const vertices = skinVertices({\n positions,\n joints,\n weights,\n skin,\n inverseBindMatrices,\n worldMatrices,\n });\n return {\n vertices,\n indices,\n bounds: deriveBounds(vertices),\n bindBounds: bounds,\n activeClipRenderable: Boolean(clip),\n activeClipDurationSeconds: clip?.durationSeconds ?? 0,\n activeClipRootTranslationDistance: clipRootMotionDistances.get(clip?.id) ?? 0,\n };\n },\n };\n}\n\nfunction skinVertices({ positions, joints, weights, skin, inverseBindMatrices, worldMatrices }) {\n return positions.map((position, vertexIndex) => {\n const jointIndices = joints[vertexIndex] ?? [0, 0, 0, 0];\n const jointWeights = weights[vertexIndex] ?? [1, 0, 0, 0];\n const skinned = [0, 0, 0];\n for (let influence = 0; influence < 4; influence += 1) {\n const weight = jointWeights[influence] ?? 0;\n if (weight <= 0) {\n continue;\n }\n const jointNodeIndex = skin.joints[jointIndices[influence] ?? 0] ?? skin.joints[0];\n const jointMatrix = multiplyMatrix(worldMatrices[jointNodeIndex] ?? identityMatrix(), inverseBindMatrices[jointIndices[influence] ?? 0] ?? identityMatrix());\n const transformed = transformPoint(jointMatrix, position);\n skinned[0] += transformed[0] * weight;\n skinned[1] += transformed[1] * weight;\n skinned[2] += transformed[2] * weight;\n }\n return skinned;\n });\n}\n","import { createAnimatedGltfModel } from \"./animated-gltf-model.js\";\nimport { createGpuRenderer } from \"./renderer-webgpu-runtime.js\";\n\nfunction nowMs() {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction lerp3(a, b, t) {\n return [\n lerp(a[0] ?? 0, b[0] ?? 0, t),\n lerp(a[1] ?? 0, b[1] ?? 0, t),\n lerp(a[2] ?? 0, b[2] ?? 0, t),\n ];\n}\n\nfunction add3(a, b) {\n return [(a[0] ?? 0) + (b[0] ?? 0), (a[1] ?? 0) + (b[1] ?? 0), (a[2] ?? 0) + (b[2] ?? 0)];\n}\n\nfunction sub3(a, b) {\n return [(a[0] ?? 0) - (b[0] ?? 0), (a[1] ?? 0) - (b[1] ?? 0), (a[2] ?? 0) - (b[2] ?? 0)];\n}\n\nfunction length3(value) {\n return Math.hypot(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\n}\n\nfunction normalize3(value, fallback = [0, 0, -1]) {\n const length = length3(value);\n return length > 1e-6\n ? [(value[0] ?? 0) / length, (value[1] ?? 0) / length, (value[2] ?? 0) / length]\n : [...fallback];\n}\n\nfunction scale3(value, scalar) {\n return [(value[0] ?? 0) * scalar, (value[1] ?? 0) * scalar, (value[2] ?? 0) * scalar];\n}\n\nfunction durationFromBeats(beats) {\n return beats.reduce((total, beat) => total + Math.max(1, beat.durationMs ?? 1), 0);\n}\n\nfunction resolveBeat(beats, loopTimeMs) {\n let cursor = 0;\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n if (loopTimeMs < cursor + durationMs) {\n return { beat, startMs: cursor, beatTimeMs: loopTimeMs - cursor, durationMs };\n }\n cursor += durationMs;\n }\n const fallback = beats.at(-1) ?? null;\n return { beat: fallback, startMs: Math.max(0, cursor - (fallback?.durationMs ?? 1)), beatTimeMs: 0, durationMs: fallback?.durationMs ?? 1 };\n}\n\nfunction movementRequirementKind(requirement, beat) {\n return requirement?.kind ?? requirement?.type ?? (beat?.kind === \"locomotion\" ? \"travel\" : \"stationary\");\n}\n\nfunction clipProfileById(clipAssets = []) {\n return new Map(clipAssets.map((clip) => [clip.id, clip.movementProfile ?? clip.profile ?? null]));\n}\n\nfunction validateProfessionalInputs({ characterModel, beats, clipAssets }) {\n const issues = [];\n if (!characterModel) {\n issues.push(\"professional animation requires a skinned GLB character model\");\n } else {\n if (!characterModel.professionalRenderable) {\n issues.push(\"professional animation requires UVs, normals, skinning, diffuse texture, normal texture, and resolved texture buffers\");\n }\n if (characterModel.textureCount <= 0) {\n issues.push(\"professional animation requires at least one model texture\");\n }\n }\n\n const profiles = clipProfileById(clipAssets);\n for (const beat of beats) {\n const kind = movementRequirementKind(beat.movementRequirement, beat);\n if (kind !== \"travel\" && kind !== \"jump\" && kind !== \"root-authored\") {\n continue;\n }\n const profile = profiles.get(beat.clipId);\n if (!profile) {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' without a movement profile`);\n continue;\n }\n if (profile.motionMode !== \"root-authored\" && profile.motionMode !== \"jump\") {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' without authored root motion`);\n }\n if (Number(profile.rootTranslationDistance ?? 0) <= 0) {\n issues.push(`beat '${beat.id}' uses '${beat.clipId}' with no root translation distance`);\n }\n }\n return issues;\n}\n\nfunction buildRouteSegments(route) {\n if (route.length < 2) {\n return [];\n }\n return route.slice(1).map((point, index) => {\n const previous = route[index];\n const vector = sub3(point.position, previous.position);\n return {\n start: previous.position,\n end: point.position,\n direction: normalize3(vector),\n distance: length3(vector),\n };\n });\n}\n\nfunction positiveNumber(value) {\n const numberValue = Number(value);\n return Number.isFinite(numberValue) && numberValue > 0 ? numberValue : 0;\n}\n\nfunction movementRequirementDistance(requirement) {\n return positiveNumber(\n requirement?.distance\n ?? requirement?.distanceMeters\n ?? requirement?.rootTranslationDistance\n ?? 0,\n );\n}\n\nfunction resolveRootMotionTravelDistance({ beat, kind, profile, segment, durationMs, elapsedMs }) {\n const rootDistance = positiveNumber(profile?.rootTranslationDistance);\n if (rootDistance <= 0) {\n return { travelled: 0, movementDistance: 0 };\n }\n\n const requestedDistance = movementRequirementDistance(beat.movementRequirement);\n const segmentDistance = positiveNumber(segment?.distance);\n const capDistance = positiveNumber(requestedDistance || segmentDistance) || rootDistance;\n const maxDistance = segmentDistance > 0\n ? Math.min(capDistance, segmentDistance)\n : capDistance;\n\n if (kind === \"jump\") {\n const progress = clamp01(elapsedMs / Math.max(1, durationMs));\n const movementDistance = Math.min(rootDistance, maxDistance);\n return {\n travelled: movementDistance * progress,\n movementDistance,\n };\n }\n\n const profileDurationMs = positiveNumber(profile?.durationMs);\n const loopedDistance = profileDurationMs > 0 && profile?.loopable !== false\n ? rootDistance * (elapsedMs / profileDurationMs)\n : rootDistance * clamp01(elapsedMs / Math.max(1, durationMs));\n const fullDistance = profileDurationMs > 0 && profile?.loopable !== false\n ? rootDistance * (durationMs / profileDurationMs)\n : rootDistance;\n const movementDistance = Math.min(fullDistance, maxDistance);\n\n return {\n travelled: Math.min(loopedDistance, movementDistance),\n movementDistance,\n };\n}\n\nfunction resolveRootMotionPosition({ route, beats, clipAssets, loopTimeMs }) {\n const profiles = clipProfileById(clipAssets);\n const segments = buildRouteSegments(route);\n let position = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n let segmentIndex = 0;\n let cursorMs = 0;\n\n for (const beat of beats) {\n const durationMs = Math.max(1, beat.durationMs ?? 1);\n const profile = profiles.get(beat.clipId);\n const kind = movementRequirementKind(beat.movementRequirement, beat);\n const moves = kind === \"travel\" || kind === \"jump\" || kind === \"root-authored\";\n const active = loopTimeMs >= cursorMs && loopTimeMs < cursorMs + durationMs;\n const elapsedMs = active ? Math.max(0, loopTimeMs - cursorMs) : durationMs;\n if (moves) {\n const segment = segments[Math.min(segmentIndex, Math.max(0, segments.length - 1))];\n if (segment) {\n const { travelled, movementDistance } = resolveRootMotionTravelDistance({\n beat,\n kind,\n profile,\n segment,\n durationMs,\n elapsedMs,\n });\n const nextPosition = add3(position, scale3(segment.direction, travelled));\n if (active) {\n return {\n position: nextPosition,\n forward: segment.direction,\n activeBeat: beat,\n activeProfile: profile,\n activeMovementMode: kind,\n movementDistance,\n };\n }\n position = nextPosition;\n if (length3(sub3(position, segment.end)) < 0.05) {\n segmentIndex += 1;\n position = [...segment.end];\n }\n }\n } else if (active) {\n return {\n position,\n forward: segments[Math.min(segmentIndex, Math.max(0, segments.length - 1))]?.direction ?? [0, 0, -1],\n activeBeat: beat,\n activeProfile: profile,\n activeMovementMode: kind,\n movementDistance: 0,\n };\n }\n cursorMs += durationMs;\n }\n\n return {\n position,\n forward: segments.at(-1)?.direction ?? [0, 0, -1],\n activeBeat: beats.at(-1) ?? null,\n activeProfile: profiles.get(beats.at(-1)?.clipId) ?? null,\n activeMovementMode: \"stationary\",\n movementDistance: 0,\n };\n}\n\nfunction createInitialSnapshot({ characterModel, camera, route }) {\n const position = route[0]?.position ? [...route[0].position] : [0, 0, 0];\n const cameraPosition = add3(position, camera.shoulderOffset ?? camera.offset ?? [-0.9, 2.2, 4.8]);\n return {\n frame: 0,\n running: false,\n renderMode: \"webgpu-pbr\",\n webGpuActive: true,\n texturedSkinnedRenderingActive: true,\n pbrMaterialActive: true,\n shadowPassActive: false,\n fallbackProxyActive: false,\n activeClipId: \"\",\n activeBeatId: \"\",\n activeMovementMode: \"stationary\",\n blendProgress: 0,\n clipTimeMs: 0,\n characterPosition: position,\n cameraPosition,\n cameraTransform: { position: cameraPosition, target: position, up: [0, 1, 0] },\n cameraViewMode: \"cinematic-follow\",\n modelLoaded: Boolean(characterModel),\n modelRenderable: true,\n textureCount: characterModel.textureCount,\n materialCount: characterModel.materialCount,\n normalTextureActive: characterModel.hasNormalTexture,\n skinnedVertexCount: characterModel.vertexCount,\n skinnedTriangleCount: characterModel.triangleCount,\n skinnedJointCount: characterModel.jointCount,\n skinnedAnimatedNodeCount: characterModel.animatedNodeCount,\n skinnedClipCount: characterModel.clipCount,\n activeClipRenderable: false,\n movementValidation: {\n status: \"passed\",\n warnings: [],\n rootMotionPolicy: \"root-motion-required\",\n rootMotionSource: \"none\",\n movementDistance: 0,\n },\n frameState: \"initialized\",\n };\n}\n\nexport async function createProfessionalAnimatedSceneRenderer(options = {}) {\n const adventure = options.animationAdventure ?? {};\n const route = [...(options.route ?? adventure.route ?? [])];\n const beats = [...(options.beats ?? adventure.beats ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n const clipAssets = options.clipAssets ?? adventure.clipAssets ?? [];\n const camera = {\n mode: \"cinematic-follow\",\n offset: [-0.9, 2.2, 4.8],\n shoulderOffset: [-0.9, 2.2, 4.8],\n velocityLookAheadMs: 420,\n yawSmoothingMs: 180,\n pitchSmoothingMs: 240,\n deadZoneRadius: 0.4,\n maxLagDistance: 2.8,\n ...(options.camera ?? adventure.camera ?? {}),\n };\n const characterModel = createAnimatedGltfModel(options.modelAsset ?? adventure.modelAsset, clipAssets);\n const inputIssues = validateProfessionalInputs({ characterModel, beats, clipAssets });\n if (inputIssues.length) {\n throw new Error(`Professional animation renderer cannot start. ${inputIssues.join(\"; \")}`);\n }\n\n const baseRenderer = await createGpuRenderer({\n ...options,\n canvas: options.canvas,\n clearColor: options.clearColor ?? \"#8fb47a\",\n });\n\n let snapshot = createInitialSnapshot({ characterModel, camera, route });\n let running = false;\n let startedAtMs;\n let frame = 0;\n let cameraPosition = [...snapshot.cameraPosition];\n const loopDurationMs = Math.max(1, durationFromBeats(beats));\n\n function renderOnce(timestamp = nowMs()) {\n if (startedAtMs === undefined) {\n startedAtMs = timestamp;\n }\n const loopTimeMs = Math.max(0, timestamp - startedAtMs) % loopDurationMs;\n const beatFrame = resolveBeat(beats, loopTimeMs);\n const motion = resolveRootMotionPosition({ route, beats, clipAssets, loopTimeMs });\n const desiredCamera = add3(motion.position, camera.shoulderOffset ?? camera.offset ?? [-0.9, 2.2, 4.8]);\n const smoothing = clamp01(16.67 / Math.max(1, camera.yawSmoothingMs ?? 180));\n cameraPosition = lerp3(cameraPosition, desiredCamera, smoothing);\n frame += 1;\n baseRenderer.renderOnce(timestamp);\n const sample = characterModel.sample(motion.activeBeat?.clipId, beatFrame.beatTimeMs);\n\n snapshot = {\n ...snapshot,\n frame,\n running,\n activeClipId: motion.activeBeat?.clipId ?? \"\",\n activeBeatId: motion.activeBeat?.id ?? \"\",\n activeMovementMode: motion.activeMovementMode,\n blendProgress: 1,\n clipTimeMs: beatFrame.beatTimeMs,\n characterPosition: motion.position,\n cameraPosition: [...cameraPosition],\n cameraTransform: {\n position: [...cameraPosition],\n target: add3(motion.position, scale3(motion.forward, 0.8)),\n up: [0, 1, 0],\n },\n activeClipRenderable: sample.activeClipRenderable,\n movementValidation: {\n status: \"passed\",\n warnings: [],\n rootMotionPolicy: \"root-motion-required\",\n rootMotionSource: motion.activeProfile?.motionMode ?? \"none\",\n rootTranslationDistance: motion.activeProfile?.rootTranslationDistance ?? 0,\n movementDistance: motion.movementDistance,\n },\n frameState: running ? \"running\" : \"rendered-once\",\n };\n return snapshot;\n }\n\n return {\n start() {\n running = true;\n snapshot = { ...snapshot, running: true, frameState: \"running\" };\n baseRenderer.start();\n },\n resize(width, height, devicePixelRatio = 1) {\n baseRenderer.resize(width, height, devicePixelRatio);\n },\n renderOnce,\n getSnapshot() {\n return {\n ...snapshot,\n characterPosition: [...snapshot.characterPosition],\n cameraPosition: [...snapshot.cameraPosition],\n cameraTransform: {\n position: [...snapshot.cameraTransform.position],\n target: [...snapshot.cameraTransform.target],\n up: [...snapshot.cameraTransform.up],\n },\n movementValidation: {\n ...snapshot.movementValidation,\n warnings: [...snapshot.movementValidation.warnings],\n },\n };\n },\n destroy() {\n running = false;\n snapshot = { ...snapshot, running: false, frameState: \"destroyed\" };\n baseRenderer.destroy();\n },\n };\n}\n","import {\n FEEDBACK_GAME_DIAGNOSTICS_CONTRACT_VERSION,\n feedbackGameDiagnosticSurfaceRegistrations,\n parseFeedbackGameDiagnostics,\n} from \"@plasius/gpu-shared/feedback-diagnostics\";\n\nconst inputKeys = Object.freeze([\n \"featureEnabled\",\n \"capabilityGranted\",\n \"consentConfirmed\",\n \"surfaceId\",\n \"renderer\",\n \"backend\",\n \"viewportWidth\",\n \"viewportHeight\",\n \"frameRate\",\n \"frameTimeMs\",\n \"featureIds\",\n \"counters\",\n \"errorCodes\",\n]);\n\nexport function bucketFeedbackGameViewport(width, height) {\n if (\n typeof width !== \"number\" ||\n typeof height !== \"number\" ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return \"unknown\";\n }\n\n const shorterEdge = Math.min(width, height);\n const longerEdge = Math.max(width, height);\n const size =\n shorterEdge < 600\n ? \"small\"\n : shorterEdge < 900 || longerEdge < 1_440\n ? \"medium\"\n : \"large\";\n const orientation = width > height ? \"landscape\" : \"portrait\";\n return `${size}-${orientation}`;\n}\n\nexport function bucketFeedbackGameFrameRate(frameRate) {\n if (\n typeof frameRate !== \"number\" ||\n !Number.isFinite(frameRate) ||\n frameRate < 0\n ) {\n return \"unknown\";\n }\n if (frameRate < 15) {\n return \"under-15\";\n }\n if (frameRate < 30) {\n return \"15-29\";\n }\n if (frameRate < 60) {\n return \"30-59\";\n }\n return \"60-plus\";\n}\n\nexport function bucketFeedbackGameFrameTime(frameTimeMs) {\n if (\n typeof frameTimeMs !== \"number\" ||\n !Number.isFinite(frameTimeMs) ||\n frameTimeMs < 0\n ) {\n return \"unknown\";\n }\n if (frameTimeMs < 17) {\n return \"under-17ms\";\n }\n if (frameTimeMs < 34) {\n return \"17-33ms\";\n }\n if (frameTimeMs < 67) {\n return \"34-66ms\";\n }\n return \"over-66ms\";\n}\n\nexport function createFeedbackGameDiagnosticSnapshot(input) {\n try {\n return createFeedbackGameDiagnosticSnapshotInternal(input);\n } catch {\n throw new TypeError(\"Invalid privacy-safe renderer diagnostics input.\");\n }\n}\n\nfunction createFeedbackGameDiagnosticSnapshotInternal(input) {\n const snapshot = snapshotInputIfEnabled(input);\n if (snapshot === null) {\n return null;\n }\n\n const registration =\n typeof snapshot.surfaceId === \"string\" &&\n Object.hasOwn(\n feedbackGameDiagnosticSurfaceRegistrations,\n snapshot.surfaceId\n )\n ? feedbackGameDiagnosticSurfaceRegistrations[snapshot.surfaceId]\n : undefined;\n\n return parseFeedbackGameDiagnostics({\n type: \"feedback-game-diagnostics\",\n version: FEEDBACK_GAME_DIAGNOSTICS_CONTRACT_VERSION,\n surfaceId: snapshot.surfaceId,\n consentConfirmed: true,\n provenanceContractId: registration?.provenanceContractId,\n renderer: snapshot.renderer,\n backend: snapshot.backend,\n viewportBucket: bucketFeedbackGameViewport(\n snapshot.viewportWidth,\n snapshot.viewportHeight\n ),\n frameRateBucket: bucketFeedbackGameFrameRate(snapshot.frameRate),\n frameTimeBucket: bucketFeedbackGameFrameTime(snapshot.frameTimeMs),\n featureIds: snapshot.featureIds,\n counters: snapshot.counters,\n errorCodes: snapshot.errorCodes,\n });\n}\n\nfunction snapshotInputIfEnabled(input) {\n assertValid(\n input !== null &&\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n (Object.getPrototypeOf(input) === Object.prototype ||\n Object.getPrototypeOf(input) === null)\n );\n\n const gateKeys = [\n \"featureEnabled\",\n \"capabilityGranted\",\n \"consentConfirmed\",\n ];\n const snapshot = Object.create(null);\n for (const key of gateKeys) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n assertValid(\n descriptor !== undefined &&\n descriptor.enumerable === true &&\n Object.hasOwn(descriptor, \"value\") &&\n typeof descriptor.value === \"boolean\"\n );\n snapshot[key] = descriptor.value;\n }\n\n const { featureEnabled, capabilityGranted, consentConfirmed } = snapshot;\n if (\n !featureEnabled ||\n !capabilityGranted ||\n !consentConfirmed\n ) {\n return null;\n }\n\n const actualKeys = Reflect.ownKeys(input);\n assertValid(\n actualKeys.length === inputKeys.length &&\n inputKeys.every((key) => actualKeys.includes(key)) &&\n actualKeys.every(\n (key) => typeof key === \"string\" && inputKeys.includes(key)\n )\n );\n\n for (const key of inputKeys.filter((key) => !gateKeys.includes(key))) {\n const descriptor = Object.getOwnPropertyDescriptor(input, key);\n assertValid(\n descriptor !== undefined &&\n descriptor.enumerable === true &&\n Object.hasOwn(descriptor, \"value\")\n );\n snapshot[key] = descriptor.value;\n }\n return Object.freeze(snapshot);\n}\n\nfunction assertValid(condition) {\n if (!condition) {\n throw new TypeError(\"Invalid privacy-safe renderer diagnostics input.\");\n }\n}\n","export function createGpuParallelismCounters() {\n return {\n directDispatches: 0,\n directWorkgroups: 0,\n directShaderInvocations: 0,\n multiWorkgroupDispatches: 0,\n largestDirectWorkgroupsPerDispatch: 0,\n indirectDispatches: 0,\n estimatedIndirectWorkgroupsUpperBound: 0,\n estimatedIndirectShaderInvocationsUpperBound: 0,\n indirectDispatchesWithMultiWorkgroupCapacity: 0,\n largestEstimatedIndirectWorkgroupsPerDispatch: 0,\n }\n}\n\nfunction countDispatchWorkgroups(groups) {\n return groups.reduce((product, value) => {\n const numeric = Number(value ?? 1)\n const count = Number.isFinite(numeric) ? Math.max(1, Math.trunc(numeric)) : 1\n return product * count\n }, 1)\n}\n\nexport function recordDirectDispatch(\n parallelism,\n groups,\n invocationsPerWorkgroup = 1\n) {\n const workgroups = countDispatchWorkgroups(groups)\n parallelism.directDispatches += 1\n parallelism.directWorkgroups += workgroups\n parallelism.directShaderInvocations += workgroups * invocationsPerWorkgroup\n parallelism.largestDirectWorkgroupsPerDispatch = Math.max(\n parallelism.largestDirectWorkgroupsPerDispatch,\n workgroups\n )\n if (workgroups > 1) {\n parallelism.multiWorkgroupDispatches += 1\n }\n}\n\nexport function recordIndirectDispatch(\n parallelism,\n estimatedWorkgroupsUpperBound,\n invocationsPerWorkgroup = 1\n) {\n const workgroups = Math.max(1, Math.trunc(Number(estimatedWorkgroupsUpperBound) || 1))\n parallelism.indirectDispatches += 1\n parallelism.estimatedIndirectWorkgroupsUpperBound += workgroups\n parallelism.estimatedIndirectShaderInvocationsUpperBound +=\n workgroups * invocationsPerWorkgroup\n parallelism.largestEstimatedIndirectWorkgroupsPerDispatch = Math.max(\n parallelism.largestEstimatedIndirectWorkgroupsPerDispatch,\n workgroups\n )\n if (workgroups > 1) {\n parallelism.indirectDispatchesWithMultiWorkgroupCapacity += 1\n }\n}\n\nexport function createGpuParallelismDiagnostics(adapterDiagnostics, counters) {\n const totalEstimatedWorkgroupsUpperBound =\n counters.directWorkgroups + counters.estimatedIndirectWorkgroupsUpperBound\n const totalEstimatedShaderInvocationsUpperBound =\n counters.directShaderInvocations +\n counters.estimatedIndirectShaderInvocationsUpperBound\n const exposesMultiWorkgroupParallelism =\n counters.multiWorkgroupDispatches > 0 ||\n counters.indirectDispatchesWithMultiWorkgroupCapacity > 0\n return Object.freeze({\n ...adapterDiagnostics,\n directDispatches: counters.directDispatches,\n directWorkgroups: counters.directWorkgroups,\n directShaderInvocations: counters.directShaderInvocations,\n multiWorkgroupDispatches: counters.multiWorkgroupDispatches,\n largestDirectWorkgroupsPerDispatch: counters.largestDirectWorkgroupsPerDispatch,\n indirectDispatches: counters.indirectDispatches,\n estimatedIndirectWorkgroupsUpperBound: counters.estimatedIndirectWorkgroupsUpperBound,\n estimatedIndirectShaderInvocationsUpperBound:\n counters.estimatedIndirectShaderInvocationsUpperBound,\n indirectDispatchesWithMultiWorkgroupCapacity:\n counters.indirectDispatchesWithMultiWorkgroupCapacity,\n largestEstimatedIndirectWorkgroupsPerDispatch:\n counters.largestEstimatedIndirectWorkgroupsPerDispatch,\n totalEstimatedWorkgroupsUpperBound,\n totalEstimatedShaderInvocationsUpperBound,\n exposesMultiWorkgroupParallelism,\n likelyUsesMoreThanOnePhysicalGpuCore: null,\n coreUtilizationStatus: \"not-exposed-by-webgpu\",\n })\n}\n\nexport function createGpuWorkerJobDiagnostics(\n parallelism,\n commandSubmissions,\n frameTimeMs,\n awaitedGpuCompletion\n) {\n const directDispatchesCompleted = Math.max(0, Number(parallelism?.directDispatches ?? 0))\n const indirectDispatchesCompleted = Math.max(\n 0,\n Number(parallelism?.indirectDispatches ?? 0)\n )\n const completedPerFrame = directDispatchesCompleted + indirectDispatchesCompleted\n const completedPerSubmission =\n commandSubmissions > 0 ? completedPerFrame / commandSubmissions : completedPerFrame\n const completedPerSecond =\n awaitedGpuCompletion && frameTimeMs > 0 ? (completedPerFrame * 1000) / frameTimeMs : null\n return Object.freeze({\n completedPerFrame,\n completedPerSecond,\n completedPerSubmission,\n directDispatchesCompleted,\n indirectDispatchesCompleted,\n frameTimeMs,\n awaitedGpuCompletion,\n })\n}\n\nexport const defaultWavefrontTransportGuardrailThresholds = Object.freeze({\n maxPerJobRegressionRatio: 0.1,\n})\n\nfunction summarizeWavefrontMemory(memory) {\n const entries = Object.entries(memory ?? {}).filter(\n ([key, value]) => key.endsWith(\"Bytes\") && Number.isFinite(value)\n )\n const totalBytes = entries.reduce((total, [, value]) => total + Number(value), 0)\n return Object.freeze({\n totalBytes,\n breakdown: memory ?? null,\n })\n}\n\nfunction normalizeDeviceLossStatus(status, awaitedGpuCompletion) {\n if (status === \"lost\") {\n return \"lost\"\n }\n if (status === \"not-exposed\") {\n return \"not-exposed\"\n }\n if (status === \"pending\") {\n return \"pending\"\n }\n return awaitedGpuCompletion ? \"not-detected\" : \"pending\"\n}\n\nfunction createTransportGuardrailCheck(id, status, details) {\n return Object.freeze({\n id,\n status,\n details,\n })\n}\n\nexport function createWavefrontTransportGuardrailSummary(frameStats, options = {}) {\n const workerJobs = frameStats?.gpuWorkerJobs ?? {}\n const commandSubmissions = Math.max(0, Number(frameStats?.commandSubmissions ?? 0))\n const completedPerFrame = Math.max(0, Number(workerJobs.completedPerFrame ?? 0))\n const completedPerSecond =\n Number.isFinite(workerJobs.completedPerSecond) && workerJobs.completedPerSecond > 0\n ? Number(workerJobs.completedPerSecond)\n : null\n const completedPerSubmission =\n commandSubmissions > 0\n ? completedPerFrame / commandSubmissions\n : Math.max(0, Number(workerJobs.completedPerSubmission ?? completedPerFrame))\n const frameTimeMs = Math.max(0, Number(workerJobs.frameTimeMs ?? 0))\n const awaitedGpuCompletion = workerJobs.awaitedGpuCompletion !== false\n const queueOverflow = Math.max(0, Number(frameStats?.queueOverflow ?? 0))\n const maxFramePassesPerSubmission = Math.max(\n 0,\n Number(frameStats?.maxFramePassesPerSubmission ?? 0)\n )\n const deviceLossStatus = normalizeDeviceLossStatus(\n options.deviceLossStatus ?? frameStats?.deviceLossStatus,\n awaitedGpuCompletion\n )\n const invalidSamples = Math.max(\n 0,\n Number(frameStats?.radianceDiagnostics?.invalidSamples ?? 0)\n )\n const legacyClampEquivalentSamples = Math.max(\n 0,\n Number(frameStats?.radianceDiagnostics?.legacyClampEquivalentSamples ?? 0)\n )\n const rayCountStatus =\n typeof frameStats?.rayCounts?.status === \"string\"\n ? frameStats.rayCounts.status\n : \"not-requested\"\n const rayCountReason =\n typeof frameStats?.rayCounts?.reason === \"string\"\n ? frameStats.rayCounts.reason\n : null\n const memory = summarizeWavefrontMemory(frameStats?.memory)\n const checks = Object.freeze([\n createTransportGuardrailCheck(\n \"device-loss\",\n deviceLossStatus === \"lost\" ? \"fail\" : deviceLossStatus === \"pending\" ? \"warn\" : \"pass\",\n deviceLossStatus === \"lost\"\n ? \"The WebGPU device was lost during or immediately after the frame.\"\n : deviceLossStatus === \"pending\"\n ? \"GPU work was not awaited, so device-loss status is still pending.\"\n : deviceLossStatus === \"not-exposed\"\n ? \"This environment does not expose device-lost diagnostics.\"\n : \"No device loss was detected for this frame.\"\n ),\n createTransportGuardrailCheck(\n \"queue-overflow\",\n queueOverflow > 0 ? \"warn\" : \"pass\",\n queueOverflow > 0\n ? `Queue overflow terminated ${queueOverflow} paths during the frame.`\n : \"No queue-overflow termination was recorded.\"\n ),\n createTransportGuardrailCheck(\n \"submission-batching\",\n commandSubmissions <= 0\n ? \"warn\"\n : maxFramePassesPerSubmission > 1 && completedPerSubmission <= 1\n ? \"warn\"\n : \"pass\",\n commandSubmissions <= 0\n ? \"No command submissions were recorded for the frame.\"\n : maxFramePassesPerSubmission > 1 && completedPerSubmission <= 1\n ? `Only ${completedPerSubmission.toFixed(2)} GPU jobs completed per command submission despite a ${maxFramePassesPerSubmission}-pass ceiling.`\n : `${completedPerFrame} GPU jobs completed across ${commandSubmissions} command submissions (${completedPerSubmission.toFixed(2)} jobs/submission).`\n ),\n createTransportGuardrailCheck(\n \"radiance-diagnostics\",\n invalidSamples > 0 ? \"fail\" : legacyClampEquivalentSamples > 0 ? \"warn\" : \"pass\",\n invalidSamples > 0\n ? `Renderer recorded ${invalidSamples} invalid radiance sample(s); inspect transport math before trusting the frame.`\n : legacyClampEquivalentSamples > 0\n ? `${legacyClampEquivalentSamples} weighted sample(s) exceeded the legacy 4.0 preview clamp threshold; convergence stayed unbiased, but review firefly diagnostics before rollout.`\n : \"No invalid radiance samples or legacy-clamp-equivalent fireflies were recorded.\"\n ),\n createTransportGuardrailCheck(\n \"ray-count-telemetry\",\n rayCountStatus === \"failed\"\n ? \"fail\"\n : rayCountStatus === \"unavailable\"\n ? \"warn\"\n : \"pass\",\n rayCountStatus === \"failed\"\n ? `Ray-count telemetry failed closed: ${rayCountReason ?? \"unknown failure\"}.`\n : rayCountStatus === \"unavailable\"\n ? `Ray-count telemetry was requested but unavailable: ${rayCountReason ?? \"unknown reason\"}.`\n : rayCountStatus === \"available\"\n ? \"Primary, secondary, and total path-segment counts were captured.\"\n : \"Ray-count telemetry was not requested for this frame.\"\n ),\n ])\n const status = checks.some((check) => check.status === \"fail\")\n ? \"fail\"\n : checks.some((check) => check.status === \"warn\")\n ? \"warn\"\n : \"pass\"\n return Object.freeze({\n status,\n thresholds: defaultWavefrontTransportGuardrailThresholds,\n current: Object.freeze({\n jobsPerFrame: completedPerFrame,\n jobsPerSecond: completedPerSecond,\n jobsPerSubmission: completedPerSubmission,\n commandSubmissions,\n frameTimeMs,\n awaitedGpuCompletion,\n maxFramePassesPerSubmission,\n queueOverflow,\n deviceLossStatus,\n radianceDiagnostics: Object.freeze({\n invalidSamples,\n legacyClampEquivalentSamples,\n }),\n rayCountStatus,\n memory,\n }),\n checks,\n })\n}\n\nexport function createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission,\n startingSubmissionCount = 0,\n labelPrefix = \"plasius.wavefront.frame\",\n}) {\n let encodedFramePasses = 0\n let submissionCount = 0\n let encoder = createCommandEncoder()\n\n function createCommandEncoder() {\n return device.createCommandEncoder({\n label: `${labelPrefix}.${frameIndex}.batched.${startingSubmissionCount + submissionCount + 1}`,\n })\n }\n\n function submitCurrentEncoder() {\n if (encodedFramePasses <= 0) {\n return false\n }\n device.queue.submit([encoder.finish()])\n submissionCount += 1\n encodedFramePasses = 0\n encoder = createCommandEncoder()\n return true\n }\n\n return Object.freeze({\n reserve(passCount = 1) {\n if (\n encodedFramePasses > 0 &&\n encodedFramePasses + passCount > maxFramePassesPerSubmission\n ) {\n submitCurrentEncoder()\n }\n encodedFramePasses += passCount\n return encoder\n },\n flush() {\n submitCurrentEncoder()\n return submissionCount\n },\n getSubmissionCount() {\n return submissionCount\n },\n })\n}\n","export const WAVEFRONT_COMPUTE_WORKGROUP_SIZE = 64;\n","import { WAVEFRONT_COMPUTE_WORKGROUP_SIZE } from \"./wavefront-workgroup.js\";\n\nexport const DEFAULT_WIDTH = 1280;\nexport const DEFAULT_HEIGHT = 720;\nexport const DEFAULT_MAX_DEPTH = 6;\nexport const MAX_PATH_TRACING_DEPTH = 32;\nexport const DEFAULT_TILE_SIZE = 128;\nexport const DEFAULT_SAMPLES_PER_PIXEL = 1;\nexport const MAX_SAMPLES_PER_PIXEL = 256;\nexport const DEFAULT_BRDF_LUT_SIZE = 128;\nexport const DEFAULT_BRDF_LUT_SAMPLE_COUNT = 256;\nexport const DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION = 256;\nexport const DEFAULT_SCENE_OBJECT_CAPACITY = 128;\nexport const DEFAULT_ENVIRONMENT_PORTAL_CAPACITY = 32;\nexport const DEFAULT_MEDIUM_PHASE_MODEL = 0;\nexport const WORKGROUP_SIZE = WAVEFRONT_COMPUTE_WORKGROUP_SIZE;\nexport const rendererWavefrontComputeMode = \"webgpu-compute\";\nexport const rendererWavefrontComputeWorkgroupSize = WORKGROUP_SIZE;\nexport const rendererWavefrontComputeStatsStride = 8;\nexport const RAY_RECORD_BYTES = 96;\nexport const HIT_RECORD_BYTES = 256;\nexport const SCENE_OBJECT_RECORD_BYTES = 160;\nexport const MESH_VERTEX_RECORD_BYTES = 48;\nexport const MESH_RANGE_RECORD_BYTES = 240;\nexport const TRIANGLE_RECORD_BYTES = 576;\nexport const GPU_MATERIAL_RECORD_BYTES = 192;\nexport const BVH_NODE_RECORD_BYTES = 48;\nexport const BVH_LEAF_REF_RECORD_BYTES = 16;\nexport const EMISSIVE_TRIANGLE_INDEX_BYTES = 4;\nexport const ENVIRONMENT_PORTAL_RECORD_BYTES = 96;\nexport const MEDIUM_TABLE_ROWS = 2;\nexport const ACCUMULATION_RECORD_BYTES = 16;\nexport const PATH_VERTEX_RECORD_BYTES = 16;\nexport const GPU_SUBMITTED_WORK_TIMEOUT_MS = 5_000;\nexport const GPU_READBACK_COMPLETION_TIMEOUT_MS = 60_000;\nexport const GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS = 60_000;\nexport const GPU_MAX_SUBMITTED_WORK_DEADLINE_MS = 180_000;\nexport const CONFIG_BUFFER_BYTES = 320;\nexport const COUNTER_DISPATCH_ARGS_OFFSET = 16;\nexport const INDIRECT_DISPATCH_ARGS_BYTES = 12;\nexport const COUNTER_BUFFER_BYTES = 128;\nexport const TERMINATION_LUMINANCE_SCALE = 1_000_000;\nexport const COUNTER_TERMINATION_EMISSIVE_OFFSET = 8;\nexport const COUNTER_TERMINATION_ENVIRONMENT_OFFSET = 9;\nexport const COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET = 10;\nexport const COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET = 11;\nexport const COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET = 12;\nexport const COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET = 13;\nexport const COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET = 14;\nexport const COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET = 15;\nexport const COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET = 16;\nexport const COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET = 17;\nexport const COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET = 18;\nexport const COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET = 19;\nexport const COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET = 20;\nexport const COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET = 21;\nexport const COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET = 22;\nexport const COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET = 23;\nexport const COUNTER_TRANSPORT_CHECKSUM_OFFSET = 24;\nexport const TRACE_STORAGE_BUFFER_BINDINGS = 10;\nexport const TRACE_SAMPLED_TEXTURE_BINDINGS = 21;\nexport const BRDF_LUT_UPLOAD_CACHE = new Map();\nexport const HIT_TYPE_SURFACE = 0;\nexport const HIT_TYPE_EMISSIVE = 1;\nexport const TERMINAL_SOURCE_KIND_EMISSIVE = 1;\nexport const TERMINAL_SOURCE_KIND_ENVIRONMENT = 2;\nexport const TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH = 3;\nexport const TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW = 4;\nexport const TERMINAL_SOURCE_KIND_ABSORPTION_NULL = 5;\nexport const TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE = 6;\nexport const TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT = 7;\nexport const TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO = 8;\nexport const MATERIAL_DIFFUSE = 0;\nexport const MATERIAL_METAL = 1;\nexport const MATERIAL_DIELECTRIC = 2;\nexport const MATERIAL_TRANSPARENT = 3;\nexport const MATERIAL_EMISSIVE = 4;\nexport const OBJECT_KIND_SPHERE = 1;\nexport const OBJECT_KIND_BOX = 2;\n\nexport const DEFAULT_CAMERA = Object.freeze({\n position: Object.freeze([0, 1.15, 5.6]),\n target: Object.freeze([0, 0.65, 0]),\n up: Object.freeze([0, 1, 0]),\n fovYDegrees: 46,\n});\n\nexport const DEFAULT_ENVIRONMENT_COLOR = Object.freeze([0.35, 0.43, 0.49, 1]);\nexport const DEFAULT_AMBIENT_COLOR = Object.freeze([0.018, 0.022, 0.026, 1]);\nexport const DEFAULT_ENVIRONMENT_LIGHTING = Object.freeze({\n horizonColor: Object.freeze([0.46, 0.56, 0.68, 1]),\n zenithColor: Object.freeze([0.04, 0.08, 0.16, 1]),\n sunDirection: Object.freeze([0.22, 0.88, 0.42]),\n sunColor: Object.freeze([2.8, 2.65, 2.35, 1]),\n intensity: 1,\n mode: 0,\n exposure: 1,\n sunlitBaseline: 0.16,\n});\n\nexport const EMPTY_TERMINATION_METRICS = Object.freeze({\n termination: Object.freeze({\n emissive: 0,\n environment: 0,\n ambientFallback: 0,\n maxDepth: 0,\n absorptionNull: 0,\n russianRoulette: 0,\n strictMaxDepth: 0,\n deterministicResidualZero: 0,\n }),\n queueOverflow: 0,\n terminalRadiance: Object.freeze({\n totalLuminance: 0,\n ambientResidualLuminance: 0,\n ambientResidualShare: 0,\n }),\n radianceDiagnostics: Object.freeze({\n invalidSamples: 0,\n legacyClampEquivalentSamples: 0,\n }),\n transportContributions: Object.freeze({\n directExplicitLuminance: 0,\n cachedIndirectLuminance: 0,\n stochasticResidualLuminance: 0,\n zeroTerminationCount: 0,\n deterministicChecksum: 0,\n }),\n});\n\nexport const wavefrontPathTracingComputeLimits = Object.freeze({\n workgroupSize: WORKGROUP_SIZE,\n traceStorageBufferBindings: TRACE_STORAGE_BUFFER_BINDINGS,\n traceSampledTextureBindings: TRACE_SAMPLED_TEXTURE_BINDINGS,\n rayRecordBytes: RAY_RECORD_BYTES,\n hitRecordBytes: HIT_RECORD_BYTES,\n sceneObjectRecordBytes: SCENE_OBJECT_RECORD_BYTES,\n meshVertexRecordBytes: MESH_VERTEX_RECORD_BYTES,\n meshRangeRecordBytes: MESH_RANGE_RECORD_BYTES,\n triangleRecordBytes: TRIANGLE_RECORD_BYTES,\n materialRecordBytes: GPU_MATERIAL_RECORD_BYTES,\n bvhNodeRecordBytes: BVH_NODE_RECORD_BYTES,\n bvhLeafReferenceRecordBytes: BVH_LEAF_REF_RECORD_BYTES,\n emissiveTriangleIndexBytes: EMISSIVE_TRIANGLE_INDEX_BYTES,\n emissiveTriangleMetadataRecordBytes: BVH_NODE_RECORD_BYTES,\n environmentPortalRecordBytes: ENVIRONMENT_PORTAL_RECORD_BYTES,\n accumulationRecordBytes: ACCUMULATION_RECORD_BYTES,\n pathVertexRecordBytes: PATH_VERTEX_RECORD_BYTES,\n counterRecordBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchRecordBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n});\n\nexport const wavefrontSceneObjectKinds = Object.freeze({\n sphere: OBJECT_KIND_SPHERE,\n box: OBJECT_KIND_BOX,\n});\n\nexport const wavefrontMaterialKinds = Object.freeze({\n diffuse: MATERIAL_DIFFUSE,\n metal: MATERIAL_METAL,\n dielectric: MATERIAL_DIELECTRIC,\n transparent: MATERIAL_TRANSPARENT,\n emissive: MATERIAL_EMISSIVE,\n});\n\nexport function readPositiveInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return numeric;\n}\n\nexport function readNonNegativeInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric < 0) {\n throw new Error(`${name} must be a non-negative integer.`);\n }\n return numeric;\n}\n\nexport function resolveWavefrontPresentationOutput(value) {\n if (value === undefined || value === null || value === \"tone-mapped\") {\n return \"tone-mapped\";\n }\n if (value === \"linear\") {\n return \"linear\";\n }\n throw new Error(\"presentationOutput must be 'tone-mapped' or 'linear'.\");\n}\n\nexport function readFiniteNumber(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n throw new Error(`${name} must be a finite number.`);\n }\n return numeric;\n}\n\nexport function assertAnalyticDisplayQualityPolicy(options = {}) {\n const meshes = Array.isArray(options.meshes)\n ? options.meshes\n : options.mesh\n ? [options.mesh]\n : [];\n if (options.displayQuality === true && meshes.length === 0) {\n throw new Error(\n \"Display-quality path tracing requires mesh BVH triangle intersections. \" +\n \"The analytic sphere/box wavefront renderer is debug-only.\"\n );\n }\n}\n\nexport function clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function asVec3(value, fallback) {\n if (!Array.isArray(value) && !(ArrayBuffer.isView(value) && value.length >= 3)) {\n return [...fallback];\n }\n return [\n readFiniteNumber(\"vector[0]\", value[0], fallback[0]),\n readFiniteNumber(\"vector[1]\", value[1], fallback[1]),\n readFiniteNumber(\"vector[2]\", value[2], fallback[2]),\n ];\n}\n\nexport function asColor(value, fallback = [1, 1, 1, 1]) {\n if (!Array.isArray(value) && !(ArrayBuffer.isView(value) && value.length >= 3)) {\n return [...fallback];\n }\n return [\n clamp(readFiniteNumber(\"color[0]\", value[0], fallback[0]), 0, 64),\n clamp(readFiniteNumber(\"color[1]\", value[1], fallback[1]), 0, 64),\n clamp(readFiniteNumber(\"color[2]\", value[2], fallback[2]), 0, 64),\n clamp(readFiniteNumber(\"color[3]\", value[3], fallback[3] ?? 1), 0, 1),\n ];\n}\n\nexport function maxComponent(value) {\n return Math.max(value?.[0] ?? 0, value?.[1] ?? 0, value?.[2] ?? 0);\n}\n\nexport function deriveLegacySheenColor(baseColor, sheen, sheenTint) {\n const sheenStrength = clamp(Number(sheen) || 0, 0, 1);\n if (sheenStrength <= 0) {\n return [0, 0, 0, 1];\n }\n const tint = clamp(Number(sheenTint) || 0, 0, 1);\n const base = asColor(baseColor, [1, 1, 1, 1]);\n return [\n clamp((1 - tint) * sheenStrength + base[0] * tint * sheenStrength, 0, 1),\n clamp((1 - tint) * sheenStrength + base[1] * tint * sheenStrength, 0, 1),\n clamp((1 - tint) * sheenStrength + base[2] * tint * sheenStrength, 0, 1),\n 1,\n ];\n}\n\nexport function resolveSheenColor(input, fallbackBaseColor) {\n if (input?.sheenColor || input?.material?.sheenColor) {\n return asColor(input.sheenColor ?? input.material?.sheenColor, [0, 0, 0, 1]).map((value, index) =>\n index < 3 ? clamp(value, 0, 1) : 1\n );\n }\n return deriveLegacySheenColor(\n fallbackBaseColor,\n input?.sheen ?? input?.material?.sheen,\n input?.sheenTint ?? input?.material?.sheenTint\n );\n}\n\nexport function resolveEnvironmentMap(input = null) {\n const source = input && typeof input === \"object\" ? input : null;\n const hasTexture = Boolean(source?.view || source?.texture || source?.data);\n const width = readPositiveInteger(\"environmentMap.width\", source?.width, 1);\n const height = readPositiveInteger(\"environmentMap.height\", source?.height, 1);\n return Object.freeze({\n enabled: hasTexture && source?.enabled !== false,\n width,\n height,\n mipLevelCount: readPositiveInteger(\n \"environmentMap.mipLevelCount\",\n source?.mipLevelCount,\n 1\n ),\n format: typeof source?.format === \"string\" ? source.format : \"rgba16float\",\n projection: typeof source?.projection === \"string\" ? source.projection : \"equirectangular\",\n texture: source?.texture ?? null,\n view: source?.view ?? null,\n sampler: source?.sampler ?? null,\n data: source?.data ?? null,\n intensity: Math.max(0, readFiniteNumber(\"environmentMap.intensity\", source?.intensity ?? source?.radianceScale, 1)),\n rotationRadians: readFiniteNumber(\"environmentMap.rotationRadians\", source?.rotationRadians ?? source?.rotation, 0),\n ambientStrength: Math.max(\n 0,\n readFiniteNumber(\"environmentMap.ambientStrength\", source?.ambientStrength, 0.32)\n ),\n hasImportanceData: source?.hasImportanceData === true,\n });\n}\n\nexport function resolveDeferredPathResolve(options = {}) {\n const value =\n options.deferredPathResolve ??\n options.deferredResolve ??\n options.pathResolve?.deferred ??\n true;\n return value !== false;\n}\n\nexport function resolveStrictPhysicalLowSppLighting(options = {}) {\n const value =\n options.strictPhysicalLowSppLighting ??\n options.featureFlags?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.enabled?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.flags?.[\"renderer.transport.strictPhysicalLowSppLighting\"] ??\n options.featureFlags?.renderer?.transport?.strictPhysicalLowSppLighting ??\n false;\n return value === true;\n}\n\nfunction readBooleanFeatureFlag(options, dottedName, nestedReader) {\n const value =\n options[dottedName] ??\n options.featureFlags?.[dottedName] ??\n options.featureFlags?.enabled?.[dottedName] ??\n options.featureFlags?.flags?.[dottedName] ??\n nestedReader?.(options.featureFlags) ??\n false;\n return value === true;\n}\n\nexport const WAVEFRONT_TRANSPORT_EXPERIMENT_BITS = Object.freeze({\n stableSampleRouting: 1 << 0,\n strictZeroOverflow: 1 << 1,\n deferLowSppRussianRoulette: 1 << 2,\n deterministicDirectLighting: 1 << 3,\n productStudioImportance: 1 << 4,\n productTransportTelemetry: 1 << 5,\n sourceStableDirectLighting: 1 << 6,\n deterministicLowSppIndirect: 1 << 7,\n});\n\nexport function resolveTransportExperiments(options = {}, strictPhysicalLowSppLighting = false) {\n const requested = Object.freeze({\n stableSampleRouting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.stableSampleRouting.enabled\",\n (flags) => flags?.renderer?.transport?.stableSampleRouting\n ),\n strictZeroOverflow: readBooleanFeatureFlag(\n options,\n \"renderer.transport.strictZeroOverflow.enabled\",\n (flags) => flags?.renderer?.transport?.strictZeroOverflow\n ),\n deferLowSppRussianRoulette: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deferLowSppRussianRoulette.enabled\",\n (flags) => flags?.renderer?.transport?.deferLowSppRussianRoulette\n ),\n deterministicDirectLighting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deterministicDirectLighting.enabled\",\n (flags) => flags?.renderer?.transport?.deterministicDirectLighting\n ),\n sourceStableDirectLighting: readBooleanFeatureFlag(\n options,\n \"renderer.transport.sourceStableDirectLighting.enabled\",\n (flags) => flags?.renderer?.transport?.sourceStableDirectLighting?.enabled\n ?? flags?.renderer?.transport?.sourceStableDirectLighting\n ),\n deterministicLowSppIndirect: readBooleanFeatureFlag(\n options,\n \"renderer.transport.deterministicLowSppIndirect.enabled\",\n (flags) => flags?.renderer?.transport?.deterministicLowSppIndirect?.enabled\n ?? flags?.renderer?.transport?.deterministicLowSppIndirect\n ),\n productStudioImportance: readBooleanFeatureFlag(\n options,\n \"renderer.environment.productStudioImportance.enabled\",\n (flags) => flags?.renderer?.environment?.productStudioImportance\n ),\n productTransportTelemetry: readBooleanFeatureFlag(\n options,\n \"renderer.diagnostics.productTransportTelemetry.enabled\",\n (flags) => flags?.renderer?.diagnostics?.productTransportTelemetry\n ),\n });\n const effective = Object.freeze({\n stableSampleRouting: requested.stableSampleRouting,\n strictZeroOverflow: requested.strictZeroOverflow && strictPhysicalLowSppLighting,\n deferLowSppRussianRoulette:\n requested.deferLowSppRussianRoulette && strictPhysicalLowSppLighting,\n deterministicDirectLighting:\n (\n requested.deterministicDirectLighting\n || requested.sourceStableDirectLighting\n || requested.deterministicLowSppIndirect\n )\n && strictPhysicalLowSppLighting,\n productStudioImportance: requested.productStudioImportance,\n productTransportTelemetry: requested.productTransportTelemetry,\n sourceStableDirectLighting:\n requested.sourceStableDirectLighting && strictPhysicalLowSppLighting,\n deterministicLowSppIndirect:\n requested.deterministicLowSppIndirect && strictPhysicalLowSppLighting,\n });\n let bitmask = 0;\n for (const [key, bit] of Object.entries(WAVEFRONT_TRANSPORT_EXPERIMENT_BITS)) {\n if (effective[key]) {\n bitmask |= bit;\n }\n }\n return Object.freeze({ requested, effective, bitmask: bitmask >>> 0 });\n}\n\nexport function emissionPower(emission) {\n return Math.max(0, emission?.[0] ?? 0) + Math.max(0, emission?.[1] ?? 0) + Math.max(0, emission?.[2] ?? 0);\n}\n\nexport function asUnitVec3(value, fallback) {\n const vector = asVec3(value, fallback);\n return normalize(vector, fallback);\n}\n\nexport function add(a, b) {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\nexport function subtract(a, b) {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nexport function scale(a, scalar) {\n return [a[0] * scalar, a[1] * scalar, a[2] * scalar];\n}\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cross(a, b) {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n ];\n}\n\nexport function normalize(value, fallback = [0, 0, 1]) {\n const length = Math.hypot(value[0], value[1], value[2]);\n if (!Number.isFinite(length) || length <= 0.000001) {\n return [...fallback];\n }\n return [value[0] / length, value[1] / length, value[2] / length];\n}\n\nexport function hashUint32(value) {\n let x = value >>> 0;\n x = ((((x >>> 16) ^ x) >>> 0) * 0x45d9f3b) >>> 0;\n x = ((((x >>> 16) ^ x) >>> 0) * 0x45d9f3b) >>> 0;\n return ((x >>> 16) ^ x) >>> 0;\n}\n\nexport function mixSeed(pixelId, sampleId, bounce, frameIndex, dimension) {\n let x =\n ((pixelId >>> 0) * 747796405) ^\n ((sampleId >>> 0) * 2891336453) ^\n ((bounce >>> 0) * 277803737) ^\n ((frameIndex >>> 0) * 1442695041) ^\n ((dimension >>> 0) * 1597334677);\n x >>>= 0;\n x ^= x >>> 16;\n x = (x * 0x7feb352d) >>> 0;\n x ^= x >>> 15;\n x = (x * 0x846ca68b) >>> 0;\n x ^= x >>> 16;\n return x >>> 0;\n}\n\nexport function random01FromSeed(seed) {\n return (hashUint32(seed) & 0x00ffffff) / 16777215;\n}\n\nexport function getArrayLikeLength(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value) ? value.length : 0;\n}\n\nexport function readVector(values, index, componentCount, fallback) {\n const offset = index * componentCount;\n const output = [];\n for (let component = 0; component < componentCount; component += 1) {\n output.push(readFiniteNumber(\"mesh attribute\", values?.[offset + component], fallback[component] ?? 0));\n }\n return output;\n}\n\nexport function readVector2(values, index, fallback = [0, 0]) {\n return readVector(values, index, 2, fallback);\n}\n\nexport function triangleBounds(v0, v1, v2) {\n return {\n min: [\n Math.min(v0[0], v1[0], v2[0]),\n Math.min(v0[1], v1[1], v2[1]),\n Math.min(v0[2], v1[2], v2[2]),\n ],\n max: [\n Math.max(v0[0], v1[0], v2[0]),\n Math.max(v0[1], v1[1], v2[1]),\n Math.max(v0[2], v1[2], v2[2]),\n ],\n };\n}\n\nexport function mergeBounds(left, right) {\n if (!left) {\n return {\n min: [...right.min],\n max: [...right.max],\n };\n }\n return {\n min: [\n Math.min(left.min[0], right.min[0]),\n Math.min(left.min[1], right.min[1]),\n Math.min(left.min[2], right.min[2]),\n ],\n max: [\n Math.max(left.max[0], right.max[0]),\n Math.max(left.max[1], right.max[1]),\n Math.max(left.max[2], right.max[2]),\n ],\n };\n}\n\nexport function boundsCentroid(bounds) {\n return [\n (bounds.min[0] + bounds.max[0]) * 0.5,\n (bounds.min[1] + bounds.max[1]) * 0.5,\n (bounds.min[2] + bounds.max[2]) * 0.5,\n ];\n}\n","export function writeVec4(floatView, byteOffset, value) {\n const offset = byteOffset / 4;\n floatView[offset] = value?.[0] ?? 0;\n floatView[offset + 1] = value?.[1] ?? 0;\n floatView[offset + 2] = value?.[2] ?? 0;\n floatView[offset + 3] = value?.[3] ?? 0;\n}\n","import {\n DEFAULT_MEDIUM_PHASE_MODEL,\n MATERIAL_DIELECTRIC,\n MATERIAL_DIFFUSE,\n MATERIAL_EMISSIVE,\n MATERIAL_METAL,\n MATERIAL_TRANSPARENT,\n asColor,\n asVec3,\n clamp,\n readFiniteNumber,\n readNonNegativeInteger,\n} from \"./wavefront-core.js\";\n\nexport function readMaterialKind(value) {\n if (typeof value === \"number\") {\n return clamp(Math.trunc(value), MATERIAL_DIFFUSE, MATERIAL_EMISSIVE);\n }\n switch (value) {\n case \"metal\":\n case \"reflective\":\n return MATERIAL_METAL;\n case \"dielectric\":\n case \"refractive\":\n case \"glass\":\n return MATERIAL_DIELECTRIC;\n case \"transparent\":\n case \"transmission\":\n return MATERIAL_TRANSPARENT;\n case \"emissive\":\n case \"light\":\n return MATERIAL_EMISSIVE;\n case \"diffuse\":\n default:\n return MATERIAL_DIFFUSE;\n }\n}\n\nfunction deriveBeerLambertAbsorptionFromAttenuationColor(\n attenuationColor,\n attenuationDistance,\n density = 1\n) {\n const distance = Number(attenuationDistance);\n const densityScale = Math.max(0, Number(density) || 0);\n if (!Number.isFinite(distance) || distance <= 0 || densityScale <= 0) {\n return [0, 0, 0];\n }\n return attenuationColor.slice(0, 3).map((channel) => {\n const clamped = clamp(Number(channel) || 0, 0.0001, 1);\n return Math.max(0, (-Math.log(clamped) / distance) * densityScale);\n });\n}\n\nfunction readMediumPhaseModel(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, Math.trunc(value));\n }\n switch (String(value ?? \"\").trim().toLowerCase()) {\n case \"isotropic\":\n default:\n return DEFAULT_MEDIUM_PHASE_MODEL;\n }\n}\n\nfunction resolveWavefrontVolumeInput(input) {\n if (input?.volume ?? input?.material?.volume) {\n return input.volume ?? input.material.volume;\n }\n const extension = resolveExtension(input, \"volume\");\n return Object.keys(extension).length > 0 ? extension : null;\n}\n\nfunction resolveMaterialExtensions(input) {\n return input?.extensions ?? input?.material?.extensions ?? input?.materialExtensions ?? {};\n}\n\nfunction resolveExtension(input, name) {\n const extensions = resolveMaterialExtensions(input);\n return extensions[name] ?? extensions[`KHR_materials_${name}`] ?? {};\n}\n\nfunction readExtensionNumber(input, extensionName, key, fallback) {\n const extension = resolveExtension(input, extensionName);\n return readFiniteNumber(\n `KHR_materials_${extensionName}.${key}`,\n extension[key],\n fallback\n );\n}\n\nfunction resolveExtensionTexture(input, extensionName, key) {\n const extension = resolveExtension(input, extensionName);\n return extension[key] ?? null;\n}\n\nexport function normalizeWavefrontMaterialExtensions(input = {}) {\n const clearcoat = resolveExtension(input, \"clearcoat\");\n const ior = resolveExtension(input, \"ior\");\n const transmission = resolveExtension(input, \"transmission\");\n const volume = resolveExtension(input, \"volume\");\n const sheen = resolveExtension(input, \"sheen\");\n const specular = resolveExtension(input, \"specular\");\n const iridescence = resolveExtension(input, \"iridescence\");\n const anisotropy = resolveExtension(input, \"anisotropy\");\n const unlit = resolveExtension(input, \"unlit\");\n return Object.freeze({\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", clearcoat.clearcoatFactor, input.clearcoat ?? input.material?.clearcoat ?? 0), 0, 1),\n clearcoatRoughness: clamp(readFiniteNumber(\"clearcoatRoughness\", clearcoat.clearcoatRoughnessFactor, input.clearcoatRoughness ?? input.material?.clearcoatRoughness ?? 0.08), 0, 1),\n ior: clamp(readFiniteNumber(\"ior\", ior.ior, input.ior ?? input.material?.ior ?? 1.45), 1, 3),\n transmission: clamp(readFiniteNumber(\"transmission\", transmission.transmissionFactor, input.transmission ?? input.material?.transmission ?? 0), 0, 1),\n volumeThickness: Math.max(0, readFiniteNumber(\"volume.thicknessFactor\", volume.thicknessFactor, input.thickness ?? input.material?.thickness ?? 0)),\n sheenColor: Object.freeze(asColor(sheen.sheenColorFactor ?? input.sheenColor ?? input.material?.sheenColor, [0, 0, 0, 1])),\n sheenRoughness: clamp(readFiniteNumber(\"sheenRoughness\", sheen.sheenRoughnessFactor, 0), 0, 1),\n specular: clamp(readFiniteNumber(\"specular\", specular.specularFactor, input.specular ?? input.material?.specular ?? 1), 0, 1),\n specularColor: Object.freeze(asColor(specular.specularColorFactor ?? input.specularColor ?? input.material?.specularColor, [1, 1, 1, 1])),\n iridescence: clamp(readFiniteNumber(\"iridescence\", iridescence.iridescenceFactor, 0), 0, 1),\n iridescenceIor: clamp(readFiniteNumber(\"iridescenceIor\", iridescence.iridescenceIor, 1.3), 1, 3),\n iridescenceThicknessMinimum: Math.max(0, readFiniteNumber(\"iridescenceThicknessMinimum\", iridescence.iridescenceThicknessMinimum, 100)),\n iridescenceThicknessMaximum: Math.max(0, readFiniteNumber(\"iridescenceThicknessMaximum\", iridescence.iridescenceThicknessMaximum, 400)),\n dispersion: clamp(readExtensionNumber(input, \"dispersion\", \"dispersion\", 0), 0, 2),\n anisotropy: clamp(readFiniteNumber(\"anisotropy\", anisotropy.anisotropyStrength, 0), 0, 1),\n anisotropyRotation: readFiniteNumber(\"anisotropyRotation\", anisotropy.anisotropyRotation, 0),\n unlit: Object.keys(unlit).length > 0,\n textures: Object.freeze({\n clearcoat: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatTexture\"),\n clearcoatRoughness: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatRoughnessTexture\"),\n clearcoatNormal: resolveExtensionTexture(input, \"clearcoat\", \"clearcoatNormalTexture\"),\n transmission: resolveExtensionTexture(input, \"transmission\", \"transmissionTexture\"),\n thickness: resolveExtensionTexture(input, \"volume\", \"thicknessTexture\"),\n sheenColor: resolveExtensionTexture(input, \"sheen\", \"sheenColorTexture\"),\n sheenRoughness: resolveExtensionTexture(input, \"sheen\", \"sheenRoughnessTexture\"),\n specular: resolveExtensionTexture(input, \"specular\", \"specularTexture\"),\n specularColor: resolveExtensionTexture(input, \"specular\", \"specularColorTexture\"),\n iridescence: resolveExtensionTexture(input, \"iridescence\", \"iridescenceTexture\"),\n iridescenceThickness: resolveExtensionTexture(input, \"iridescence\", \"iridescenceThicknessTexture\"),\n anisotropy: resolveExtensionTexture(input, \"anisotropy\", \"anisotropyTexture\"),\n }),\n });\n}\n\nexport function normalizeWavefrontThickness(input, label) {\n const volume = resolveWavefrontVolumeInput(input);\n return Math.max(\n 0,\n readFiniteNumber(\n label,\n input?.thickness ?? volume?.thickness ?? input?.material?.thickness,\n 0\n )\n );\n}\n\nfunction resolveWavefrontMediumId(input, fallbackId = 1) {\n return (\n input?.mediumRefId ??\n input?.mediumId ??\n input?.material?.mediumId ??\n input?.materialRefId ??\n input?.material?.id ??\n input?.materialId ??\n input?.id ??\n fallbackId\n );\n}\n\nexport function deriveWavefrontTransportMedium(input, fallbackId = 1) {\n const resolvedId = resolveWavefrontMediumId(input, fallbackId);\n if (input?.medium) {\n return normalizeWavefrontMedium(\n {\n ...input.medium,\n id: input.medium.id ?? input.medium.mediumId ?? resolvedId,\n },\n fallbackId\n );\n }\n const volume = resolveWavefrontVolumeInput(input);\n if (!volume) {\n return null;\n }\n return normalizeWavefrontMedium(\n {\n id: resolvedId,\n phaseModel: volume.phaseModel,\n density: volume.density,\n attenuationColor: volume.attenuationColor,\n attenuationDistance: volume.attenuationDistance,\n absorption: volume.absorption,\n scattering: volume.scattering,\n },\n fallbackId\n );\n}\n\nfunction normalizeWavefrontMedium(input = {}, index = 0) {\n const id = readNonNegativeInteger(\"medium id\", input.id ?? input.mediumId, index);\n const density = Math.max(0, readFiniteNumber(\"medium density\", input.density, 1));\n const attenuationColor = asColor(\n input.attenuationColor ?? input.color ?? input.medium?.attenuationColor,\n [1, 1, 1, 1]\n );\n const attenuationDistance = readFiniteNumber(\n \"medium attenuationDistance\",\n input.attenuationDistance ?? input.distance ?? input.medium?.attenuationDistance,\n 0\n );\n const absorption =\n Array.isArray(input.absorption) || Array.isArray(input.medium?.absorption)\n ? asVec3(input.absorption ?? input.medium?.absorption, [0, 0, 0]).map((value) =>\n Math.max(0, Number(value) || 0)\n )\n : deriveBeerLambertAbsorptionFromAttenuationColor(\n attenuationColor,\n attenuationDistance,\n density\n );\n const scattering = asVec3(\n input.scattering ?? input.medium?.scattering,\n [0, 0, 0]\n ).map((value) => Math.max(0, Number(value) || 0));\n return Object.freeze({\n id,\n phaseModel: readMediumPhaseModel(input.phaseModel ?? input.medium?.phaseModel),\n density,\n attenuationColor: Object.freeze(attenuationColor),\n attenuationDistance,\n absorption: Object.freeze(absorption),\n scattering: Object.freeze(scattering),\n });\n}\n\nexport function collectWavefrontMediums(options, meshes, sceneObjects = []) {\n const mediumsById = new Map();\n mediumsById.set(\n 0,\n Object.freeze({\n id: 0,\n phaseModel: DEFAULT_MEDIUM_PHASE_MODEL,\n density: 0,\n attenuationColor: Object.freeze([1, 1, 1, 1]),\n attenuationDistance: 0,\n absorption: Object.freeze([0, 0, 0]),\n scattering: Object.freeze([0, 0, 0]),\n })\n );\n\n const register = (input, fallbackId = mediumsById.size) => {\n if (!input) {\n return;\n }\n const normalized = normalizeWavefrontMedium(\n typeof input === \"object\" ? { id: fallbackId, ...input } : { id: fallbackId },\n fallbackId\n );\n const existing = mediumsById.get(normalized.id);\n if (existing && JSON.stringify(existing) !== JSON.stringify(normalized)) {\n throw new Error(`Medium id ${normalized.id} is defined more than once with different values.`);\n }\n mediumsById.set(normalized.id, normalized);\n };\n\n for (const medium of options.mediums ?? []) {\n register(medium);\n }\n for (const mesh of meshes) {\n register(mesh.medium, mesh.mediumRefId ?? mesh.medium?.id ?? 0);\n }\n for (const mesh of meshes) {\n if ((mesh.mediumRefId ?? 0) > 0 && !mediumsById.has(mesh.mediumRefId)) {\n register({ id: mesh.mediumRefId });\n }\n }\n for (const object of sceneObjects) {\n register(object.medium, object.mediumRefId ?? object.medium?.id ?? 0);\n }\n for (const object of sceneObjects) {\n if ((object.mediumRefId ?? 0) > 0 && !mediumsById.has(object.mediumRefId)) {\n register({ id: object.mediumRefId });\n }\n }\n\n return Object.freeze(\n Array.from(mediumsById.values()).sort((left, right) => left.id - right.id)\n );\n}\n","import {\n MATERIAL_EMISSIVE,\n MATERIAL_TRANSPARENT,\n OBJECT_KIND_BOX,\n OBJECT_KIND_SPHERE,\n add,\n asColor,\n asVec3,\n clamp,\n getArrayLikeLength,\n readFiniteNumber,\n readNonNegativeInteger,\n resolveSheenColor,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n deriveWavefrontTransportMedium,\n normalizeWavefrontMaterialExtensions,\n normalizeWavefrontThickness,\n readMaterialKind,\n} from \"./wavefront-materials.js\";\n\nfunction readObjectKind(value) {\n if (typeof value === \"number\") {\n return value === OBJECT_KIND_BOX ? OBJECT_KIND_BOX : OBJECT_KIND_SPHERE;\n }\n switch (value) {\n case \"box\":\n case \"aabb\":\n case \"bounds\":\n return OBJECT_KIND_BOX;\n case \"sphere\":\n default:\n return OBJECT_KIND_SPHERE;\n }\n}\n\nfunction deriveBounds(input) {\n if (Array.isArray(input?.min) && Array.isArray(input?.max)) {\n const min = asVec3(input.min, [-0.5, -0.5, -0.5]);\n const max = asVec3(input.max, [0.5, 0.5, 0.5]);\n return {\n center: scale(add(min, max), 0.5),\n halfExtent: scale(subtract(max, min), 0.5).map((value) => Math.max(value, 0.001)),\n };\n }\n\n if (Array.isArray(input?.bounds?.min) && Array.isArray(input?.bounds?.max)) {\n return deriveBounds(input.bounds);\n }\n\n return null;\n}\n\nexport function normalizeWavefrontSceneObject(input = {}, index = 0) {\n const bounds = deriveBounds(input);\n const kind = readObjectKind(input.kind ?? input.type ?? (bounds ? \"box\" : \"sphere\"));\n const center = asVec3(input.center ?? input.position ?? bounds?.center, [0, 0, 0]);\n const radius = readFiniteNumber(\"radius\", input.radius, 0.5);\n const halfExtent =\n kind === OBJECT_KIND_SPHERE\n ? [Math.max(radius, 0.001), Math.max(radius, 0.001), Math.max(radius, 0.001)]\n : asVec3(\n input.halfExtent ?? input.halfExtents ?? input.extents ?? bounds?.halfExtent,\n [0.5, 0.5, 0.5]\n ).map((value) => Math.max(value, 0.001));\n const materialKindInput = input.materialKind ?? input.material?.kind;\n const materialKind = readMaterialKind(materialKindInput);\n const materialExtensions = normalizeWavefrontMaterialExtensions(input);\n const color = asColor(\n input.color ??\n input.baseColor ??\n input.albedo ??\n input.material?.color ??\n input.material?.baseColor,\n [0.72, 0.72, 0.68, 1]\n );\n const emission = asColor(\n input.emission ?? input.emissive ?? input.material?.emission ?? input.material?.emissive,\n [0, 0, 0, 1]\n );\n const opacity = clamp(readFiniteNumber(\"opacity\", input.opacity ?? input.material?.opacity, color[3] ?? 1), 0, 1);\n const transmission = clamp(\n readFiniteNumber(\"transmission\", input.transmission ?? input.material?.transmission, materialExtensions.transmission),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, materialExtensions.sheenColor ?? color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor ?? materialExtensions.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 1));\n const medium = deriveWavefrontTransportMedium(input, index + 1);\n const resolvedMaterialKind =\n emission[0] > 0 || emission[1] > 0 || emission[2] > 0\n ? MATERIAL_EMISSIVE\n : materialKindInput === undefined || materialKindInput === null\n ? transmission > 0.001 || opacity < 0.999\n ? MATERIAL_TRANSPARENT\n : materialKind\n : materialKind;\n\n return Object.freeze({\n id: readNonNegativeInteger(\"id\", input.id, index + 1),\n kind,\n materialKind: resolvedMaterialKind,\n flags: readNonNegativeInteger(\"flags\", input.flags, 0),\n mediumRefId: readNonNegativeInteger(\n \"mediumRefId\",\n input.mediumRefId ?? medium?.id ?? input.medium?.id ?? input.mediumId,\n 0\n ),\n medium,\n center: Object.freeze(center),\n halfExtent: Object.freeze(halfExtent),\n color: Object.freeze(color),\n emission: Object.freeze(emission),\n roughness: clamp(readFiniteNumber(\"roughness\", input.roughness ?? input.material?.roughness, 0.72), 0, 1),\n metallic: clamp(readFiniteNumber(\"metallic\", input.metallic ?? input.material?.metallic, 0), 0, 1),\n opacity,\n ior: clamp(readFiniteNumber(\"ior\", input.ior ?? input.material?.ior, materialExtensions.ior), 1, 3),\n sheen: clamp(readFiniteNumber(\"sheen\", input.sheen ?? input.material?.sheen, 0), 0, 1),\n sheenTint: clamp(readFiniteNumber(\"sheenTint\", input.sheenTint ?? input.material?.sheenTint, 0), 0, 1),\n sheenColor: Object.freeze(sheenColor),\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", input.clearcoat ?? input.material?.clearcoat, materialExtensions.clearcoat), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n materialExtensions.clearcoatRoughness\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, materialExtensions.specular), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: Math.max(normalizeWavefrontThickness(input, \"thickness\"), materialExtensions.volumeThickness),\n transmission,\n materialExtensions,\n });\n}\n\nexport function createDefaultWavefrontSceneObjects() {\n return Object.freeze([\n normalizeWavefrontSceneObject({\n type: \"box\",\n id: 1,\n center: [0, -0.08, 0],\n halfExtent: [3.25, 0.08, 3.25],\n color: [0.45, 0.53, 0.54, 1],\n roughness: 0.5,\n }),\n normalizeWavefrontSceneObject({\n type: \"box\",\n id: 2,\n center: [0, 1.25, -1.65],\n halfExtent: [2.45, 1.45, 0.08],\n color: [0.42, 0.41, 0.38, 1],\n roughness: 0.85,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 3,\n center: [-0.9, 0.72, 0.05],\n radius: 0.72,\n color: [0.76, 0.72, 0.64, 1],\n materialKind: \"metal\",\n roughness: 0.08,\n metallic: 0.7,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 4,\n center: [0.85, 0.65, -0.05],\n radius: 0.58,\n color: [0.68, 0.82, 0.86, 0.72],\n materialKind: \"dielectric\",\n roughness: 0.02,\n opacity: 0.72,\n ior: 1.35,\n }),\n normalizeWavefrontSceneObject({\n type: \"sphere\",\n id: 5,\n center: [0, 2.55, -0.65],\n radius: 0.34,\n color: [1, 0.94, 0.78, 1],\n emission: [7.2, 6.5, 4.2, 1],\n materialKind: \"emissive\",\n }),\n ]);\n}\n\nexport function normalizeWavefrontMesh(input = {}, meshIndex = 0) {\n const positions = input.positions;\n const positionLength = getArrayLikeLength(positions);\n if (positionLength < 9 || positionLength % 3 !== 0) {\n throw new Error(\"Wavefront mesh positions must contain at least three vec3 vertices.\");\n }\n\n const vertexCount = positionLength / 3;\n const indices =\n getArrayLikeLength(input.indices) > 0\n ? Array.from(input.indices, (value) => readNonNegativeInteger(\"mesh index\", value, 0))\n : Array.from({ length: vertexCount }, (_, index) => index);\n if (indices.length < 3 || indices.length % 3 !== 0) {\n throw new Error(\"Wavefront mesh indices must contain complete triangles.\");\n }\n if (indices.some((index) => index >= vertexCount)) {\n throw new Error(\"Wavefront mesh index references a vertex outside the position buffer.\");\n }\n\n const normals =\n getArrayLikeLength(input.normals) >= positionLength\n ? Array.from(input.normals, (value) => readFiniteNumber(\"mesh normal\", value, 0))\n : null;\n const uvs =\n getArrayLikeLength(input.uvs ?? input.texcoords ?? input.uv) >= vertexCount * 2\n ? Array.from(input.uvs ?? input.texcoords ?? input.uv, (value) =>\n readFiniteNumber(\"mesh uv\", value, 0)\n )\n : null;\n const materialKindInput = input.materialKind ?? input.material?.kind;\n const materialKind = readMaterialKind(materialKindInput);\n const materialExtensions = normalizeWavefrontMaterialExtensions(input);\n const color = asColor(\n input.color ??\n input.baseColor ??\n input.albedo ??\n input.material?.color ??\n input.material?.baseColor,\n [0.72, 0.72, 0.68, 1]\n );\n const emission = asColor(\n input.emission ?? input.emissive ?? input.material?.emission ?? input.material?.emissive,\n [0, 0, 0, 1]\n );\n const opacity = clamp(readFiniteNumber(\"opacity\", input.opacity ?? input.material?.opacity, color[3] ?? 1), 0, 1);\n const transmission = clamp(\n readFiniteNumber(\"transmission\", input.transmission ?? input.material?.transmission, materialExtensions.transmission),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, materialExtensions.sheenColor ?? color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor ?? materialExtensions.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 1));\n const medium = deriveWavefrontTransportMedium(input, meshIndex + 1);\n const resolvedMaterialKind =\n emission[0] > 0 || emission[1] > 0 || emission[2] > 0\n ? MATERIAL_EMISSIVE\n : materialKindInput === undefined || materialKindInput === null\n ? transmission > 0.001 || opacity < 0.999\n ? MATERIAL_TRANSPARENT\n : materialKind\n : materialKind;\n\n return Object.freeze({\n id: readNonNegativeInteger(\"mesh id\", input.id, meshIndex + 1),\n positions: Object.freeze(Array.from(positions, (value) => readFiniteNumber(\"mesh position\", value, 0))),\n indices: Object.freeze(indices),\n normals: normals ? Object.freeze(normals) : null,\n uvs: uvs ? Object.freeze(uvs) : null,\n materialKind: resolvedMaterialKind,\n flags: readNonNegativeInteger(\"mesh flags\", input.flags, 0),\n materialRefId: readNonNegativeInteger(\n \"mesh materialRefId\",\n input.materialRefId ?? input.material?.id ?? input.materialId,\n meshIndex\n ),\n mediumRefId: readNonNegativeInteger(\n \"mesh mediumRefId\",\n input.mediumRefId ??\n medium?.id ??\n input.medium?.id ??\n input.mediumId ??\n input.material?.mediumId,\n 0\n ),\n medium,\n color: Object.freeze(color),\n emission: Object.freeze(emission),\n roughness: clamp(readFiniteNumber(\"roughness\", input.roughness ?? input.material?.roughness, 0.72), 0, 1),\n metallic: clamp(readFiniteNumber(\"metallic\", input.metallic ?? input.material?.metallic, 0), 0, 1),\n opacity,\n ior: clamp(readFiniteNumber(\"ior\", input.ior ?? input.material?.ior, materialExtensions.ior), 1, 3),\n sheen: clamp(readFiniteNumber(\"sheen\", input.sheen ?? input.material?.sheen, 0), 0, 1),\n sheenTint: clamp(readFiniteNumber(\"sheenTint\", input.sheenTint ?? input.material?.sheenTint, 0), 0, 1),\n sheenColor: Object.freeze(sheenColor),\n clearcoat: clamp(readFiniteNumber(\"clearcoat\", input.clearcoat ?? input.material?.clearcoat, materialExtensions.clearcoat), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n materialExtensions.clearcoatRoughness\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, materialExtensions.specular), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: Math.max(normalizeWavefrontThickness(input, \"mesh thickness\"), materialExtensions.volumeThickness),\n transmission,\n materialExtensions,\n baseColorTexture: input.baseColorTexture ?? input.material?.baseColorTexture ?? null,\n metallicRoughnessTexture:\n input.metallicRoughnessTexture ?? input.material?.metallicRoughnessTexture ?? null,\n normalTexture: input.normalTexture ?? input.material?.normalTexture ?? null,\n occlusionTexture: input.occlusionTexture ?? input.material?.occlusionTexture ?? null,\n emissiveTexture: input.emissiveTexture ?? input.material?.emissiveTexture ?? null,\n extensionTextures: materialExtensions.textures,\n });\n}\n\nexport function normalizeSceneObjects(sceneObjects, useDefaultScene = true) {\n const source =\n Array.isArray(sceneObjects) && sceneObjects.length > 0\n ? sceneObjects\n : useDefaultScene\n ? createDefaultWavefrontSceneObjects()\n : [];\n return source.map((object, index) => normalizeWavefrontSceneObject(object, index));\n}\n\nexport function normalizeWavefrontMeshes(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\n return source.map((mesh, index) => normalizeWavefrontMesh(mesh, index));\n}\n\nexport function normalizeMeshes(options = {}) {\n if (Array.isArray(options.meshes)) {\n return normalizeWavefrontMeshes(options.meshes);\n }\n if (options.mesh) {\n return normalizeWavefrontMeshes([options.mesh]);\n }\n return [];\n}\n","import {\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n GPU_MATERIAL_RECORD_BYTES,\n MATERIAL_EMISSIVE,\n MESH_RANGE_RECORD_BYTES,\n MESH_VERTEX_RECORD_BYTES,\n boundsCentroid,\n clamp,\n cross,\n emissionPower,\n mergeBounds,\n normalize,\n readNonNegativeInteger,\n readVector,\n readVector2,\n subtract,\n triangleBounds,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport { normalizeWavefrontMesh } from \"./wavefront-scene-normalizers.js\";\n\nfunction clampUnit(value) {\n return clamp(Number(value) || 0, 0, 1);\n}\n\nfunction createMeshTriangleRecords(meshes, gpuMaterialSource = null) {\n const source = Array.isArray(meshes) ? meshes : [];\n const resolvedMaterialSource = gpuMaterialSource ?? createWavefrontGpuMaterialSource(source);\n let nextTriangleId = 0;\n return source.flatMap((meshInput, meshIndex) => {\n const mesh = normalizeWavefrontMesh(meshInput, meshIndex);\n const triangles = [];\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const a = mesh.indices[index];\n const b = mesh.indices[index + 1];\n const c = mesh.indices[index + 2];\n const v0 = readVector(mesh.positions, a, 3, [0, 0, 0]);\n const v1 = readVector(mesh.positions, b, 3, [0, 0, 0]);\n const v2 = readVector(mesh.positions, c, 3, [0, 0, 0]);\n const faceNormal = normalize(cross(subtract(v1, v0), subtract(v2, v0)), [0, 1, 0]);\n const n0 = mesh.normals ? normalize(readVector(mesh.normals, a, 3, faceNormal), faceNormal) : faceNormal;\n const n1 = mesh.normals ? normalize(readVector(mesh.normals, b, 3, faceNormal), faceNormal) : faceNormal;\n const n2 = mesh.normals ? normalize(readVector(mesh.normals, c, 3, faceNormal), faceNormal) : faceNormal;\n const uv0 = mesh.uvs ? readVector2(mesh.uvs, a) : [0, 0];\n const uv1 = mesh.uvs ? readVector2(mesh.uvs, b) : [0, 0];\n const uv2 = mesh.uvs ? readVector2(mesh.uvs, c) : [0, 0];\n const bounds = triangleBounds(v0, v1, v2);\n\n triangles.push(\n Object.freeze({\n triangleId: nextTriangleId,\n meshId: mesh.id,\n materialKind: mesh.materialKind,\n flags: mesh.flags,\n materialRefId: mesh.materialRefId,\n mediumRefId: mesh.mediumRefId,\n materialSlot: meshIndex,\n v0: Object.freeze(v0),\n v1: Object.freeze(v1),\n v2: Object.freeze(v2),\n n0: Object.freeze(n0),\n n1: Object.freeze(n1),\n n2: Object.freeze(n2),\n uv0: Object.freeze(uv0),\n uv1: Object.freeze(uv1),\n uv2: Object.freeze(uv2),\n color: mesh.color,\n emission: mesh.emission,\n material: Object.freeze([\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]),\n materialResponse: Object.freeze([\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]),\n materialExtension: Object.freeze([\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]),\n materialExtension2: Object.freeze([\n mesh.materialExtensions?.dispersion ?? 0,\n mesh.materialExtensions?.iridescence ?? 0,\n mesh.materialExtensions?.iridescenceIor ?? 1.3,\n mesh.materialExtensions?.anisotropy ?? 0,\n ]),\n materialExtension3: Object.freeze([\n mesh.materialExtensions?.iridescenceThicknessMinimum ?? 100,\n mesh.materialExtensions?.iridescenceThicknessMaximum ?? 400,\n mesh.materialExtensions?.sheenRoughness ?? 0,\n mesh.materialExtensions?.anisotropyRotation ?? 0,\n ]),\n specularColor: Object.freeze([\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]),\n baseColorAtlas: Object.freeze(\n resolvedMaterialSource.baseColorAtlas.resolveRect(mesh.baseColorTexture)\n ),\n metallicRoughnessAtlas: Object.freeze(\n resolvedMaterialSource.metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n ),\n normalAtlas: Object.freeze(\n resolvedMaterialSource.normalAtlas.resolveRect(mesh.normalTexture)\n ),\n occlusionAtlas: Object.freeze(\n resolvedMaterialSource.occlusionAtlas.resolveRect(mesh.occlusionTexture)\n ),\n emissiveAtlas: Object.freeze(\n resolvedMaterialSource.emissiveAtlas.resolveRect(mesh.emissiveTexture)\n ),\n textureSettings: Object.freeze([\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]),\n extensionTextures: Object.freeze(\n Object.fromEntries(\n Object.entries(resolvedMaterialSource.extensionAtlases ?? {}).map(([name, atlas]) => [\n name,\n atlas.resolveRect(mesh.extensionTextures?.[name]),\n ])\n )\n ),\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n centroid: Object.freeze(boundsCentroid(bounds)),\n })\n );\n nextTriangleId += 1;\n }\n return triangles;\n });\n}\n\nfunction chooseSplitAxis(triangles) {\n const centroidBounds = triangles.reduce(\n (bounds, triangle) => {\n const pointBounds = { min: triangle.centroid, max: triangle.centroid };\n return mergeBounds(bounds, pointBounds);\n },\n null\n );\n const extent = subtract(centroidBounds.max, centroidBounds.min);\n if (extent[0] >= extent[1] && extent[0] >= extent[2]) {\n return 0;\n }\n return extent[1] >= extent[2] ? 1 : 2;\n}\n\nfunction buildBvh(triangles, maxLeafTriangles = 4) {\n if (triangles.length === 0) {\n return Object.freeze({ nodes: Object.freeze([]), triangles: Object.freeze([]) });\n }\n\n const nodes = [];\n const orderedTriangles = [];\n\n function buildNode(nodeTriangles) {\n const nodeIndex = nodes.length;\n nodes.push(null);\n const bounds = nodeTriangles.reduce((current, triangle) => mergeBounds(current, triangle.bounds), null);\n\n if (nodeTriangles.length <= maxLeafTriangles) {\n const firstTriangle = orderedTriangles.length;\n orderedTriangles.push(...nodeTriangles);\n nodes[nodeIndex] = Object.freeze({\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n firstTriangle,\n triangleCount: nodeTriangles.length,\n leftChild: 0,\n rightChild: 0,\n });\n return nodeIndex;\n }\n\n const axis = chooseSplitAxis(nodeTriangles);\n const sorted = [...nodeTriangles].sort((left, right) => left.centroid[axis] - right.centroid[axis]);\n const midpoint = Math.max(1, Math.floor(sorted.length / 2));\n const leftChild = buildNode(sorted.slice(0, midpoint));\n const rightChild = buildNode(sorted.slice(midpoint));\n nodes[nodeIndex] = Object.freeze({\n bounds: Object.freeze({\n min: Object.freeze(bounds.min),\n max: Object.freeze(bounds.max),\n }),\n firstTriangle: leftChild,\n triangleCount: 0,\n leftChild,\n rightChild,\n });\n return nodeIndex;\n }\n\n buildNode(triangles);\n return Object.freeze({\n nodes: Object.freeze(nodes),\n triangles: Object.freeze(orderedTriangles),\n });\n}\n\nexport function createWavefrontMeshAcceleration(meshes = [], gpuMaterialSource = null) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const resolvedMaterialSource = gpuMaterialSource ?? createWavefrontGpuMaterialSource(source);\n const triangles = createMeshTriangleRecords(source, resolvedMaterialSource);\n return buildBvh(triangles);\n}\n\nexport function estimateMeshSourceShape(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\n return source.reduce(\n (shape, meshInput, meshIndex) => {\n const mesh = normalizeWavefrontMesh(meshInput, meshIndex);\n return {\n vertexCount: shape.vertexCount + mesh.positions.length / 3,\n indexCount: shape.indexCount + mesh.indices.length,\n meshCount: shape.meshCount + 1,\n triangleCount: shape.triangleCount + mesh.indices.length / 3,\n };\n },\n {\n vertexCount: 0,\n indexCount: 0,\n meshCount: 0,\n triangleCount: 0,\n }\n );\n}\n\nexport function estimateBinaryBvhNodeCapacity(triangleCount) {\n return triangleCount <= 0 ? 0 : Math.max(1, triangleCount * 2 - 1);\n}\n\nfunction nextPowerOfTwo(value) {\n if (value <= 1) {\n return Math.max(0, value);\n }\n return 2 ** Math.ceil(Math.log2(value));\n}\n\nfunction textureComponentToByte(value, fallback) {\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return fallback;\n }\n if (numeric >= 0 && numeric <= 1) {\n return Math.max(0, Math.min(255, Math.round(numeric * 255)));\n }\n return Math.max(0, Math.min(255, Math.round(numeric)));\n}\n\nfunction createSolidTextureSample(width, height, rgba) {\n const data = new Uint8Array(width * height * 4);\n for (let offset = 0; offset < data.length; offset += 4) {\n data[offset] = rgba[0];\n data[offset + 1] = rgba[1];\n data[offset + 2] = rgba[2];\n data[offset + 3] = rgba[3];\n }\n return Object.freeze({\n width,\n height,\n data,\n });\n}\n\nfunction normalizeTextureSampleInput(texture, fallbackColor) {\n if (\n !texture ||\n !Number.isFinite(texture.width) ||\n !Number.isFinite(texture.height) ||\n texture.width <= 0 ||\n texture.height <= 0\n ) {\n return createSolidTextureSample(1, 1, fallbackColor);\n }\n\n const pixelCount = Math.trunc(texture.width) * Math.trunc(texture.height) * 4;\n const source =\n ArrayBuffer.isView(texture.data) || Array.isArray(texture.data) ? texture.data : null;\n if (!source || source.length < pixelCount) {\n return createSolidTextureSample(1, 1, fallbackColor);\n }\n\n const data = new Uint8Array(pixelCount);\n for (let index = 0; index < pixelCount; index += 1) {\n data[index] = textureComponentToByte(source[index], fallbackColor[index % 4]);\n }\n\n return Object.freeze({\n width: Math.trunc(texture.width),\n height: Math.trunc(texture.height),\n data,\n });\n}\n\nfunction buildTextureAtlas(textures, fallbackColor) {\n const padding = 1;\n const defaultTexture = createSolidTextureSample(1, 1, fallbackColor);\n const uniqueEntries = [{ source: null, texture: defaultTexture }];\n const bySource = new Map();\n\n for (const texture of Array.isArray(textures) ? textures : []) {\n if (!texture || bySource.has(texture)) {\n continue;\n }\n const normalized = normalizeTextureSampleInput(texture, fallbackColor);\n bySource.set(texture, uniqueEntries.length);\n uniqueEntries.push({ source: texture, texture: normalized });\n }\n\n const totalArea = uniqueEntries.reduce((sum, entry) => {\n return sum + (entry.texture.width + padding * 2) * (entry.texture.height + padding * 2);\n }, 0);\n const maxTileWidth = uniqueEntries.reduce((maxWidth, entry) => {\n return Math.max(maxWidth, entry.texture.width + padding * 2);\n }, 1);\n const targetWidth = Math.max(\n maxTileWidth,\n nextPowerOfTwo(Math.max(maxTileWidth, Math.ceil(Math.sqrt(totalArea))))\n );\n\n let cursorX = 0;\n let cursorY = 0;\n let rowHeight = 0;\n let atlasWidth = 0;\n const placements = uniqueEntries.map((entry) => {\n const tileWidth = entry.texture.width + padding * 2;\n const tileHeight = entry.texture.height + padding * 2;\n if (cursorX > 0 && cursorX + tileWidth > targetWidth) {\n cursorX = 0;\n cursorY += rowHeight;\n rowHeight = 0;\n }\n const placement = Object.freeze({\n x: cursorX,\n y: cursorY,\n tileWidth,\n tileHeight,\n width: entry.texture.width,\n height: entry.texture.height,\n });\n cursorX += tileWidth;\n atlasWidth = Math.max(atlasWidth, cursorX);\n rowHeight = Math.max(rowHeight, tileHeight);\n return placement;\n });\n\n const atlasHeight = Math.max(1, cursorY + rowHeight);\n const atlasData = new Uint8Array(Math.max(1, atlasWidth * atlasHeight * 4));\n\n const writePixel = (x, y, rgba) => {\n const offset = (y * atlasWidth + x) * 4;\n atlasData[offset] = rgba[0];\n atlasData[offset + 1] = rgba[1];\n atlasData[offset + 2] = rgba[2];\n atlasData[offset + 3] = rgba[3];\n };\n\n const rects = placements.map((placement, entryIndex) => {\n const { texture } = uniqueEntries[entryIndex];\n for (let y = 0; y < placement.tileHeight; y += 1) {\n for (let x = 0; x < placement.tileWidth; x += 1) {\n const sampleX = Math.max(0, Math.min(texture.width - 1, x - padding));\n const sampleY = Math.max(0, Math.min(texture.height - 1, y - padding));\n const sourceOffset = (sampleY * texture.width + sampleX) * 4;\n writePixel(placement.x + x, placement.y + y, texture.data.slice(sourceOffset, sourceOffset + 4));\n }\n }\n return Object.freeze([\n (placement.x + padding) / Math.max(1, atlasWidth),\n (placement.y + padding) / Math.max(1, atlasHeight),\n placement.width / Math.max(1, atlasWidth),\n placement.height / Math.max(1, atlasHeight),\n ]);\n });\n\n const rectBySource = new Map();\n uniqueEntries.forEach((entry, index) => {\n if (entry.source) {\n rectBySource.set(entry.source, rects[index]);\n }\n });\n\n return Object.freeze({\n width: Math.max(1, atlasWidth),\n height: Math.max(1, atlasHeight),\n data: atlasData,\n defaultRect: rects[0],\n resolveRect(texture) {\n return rectBySource.get(texture) ?? rects[0];\n },\n });\n}\n\nexport function createWavefrontGpuMaterialSource(meshes = []) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const baseColorAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.baseColorTexture),\n [255, 255, 255, 255]\n );\n const metallicRoughnessAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.metallicRoughnessTexture),\n [255, 255, 255, 255]\n );\n const normalAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.normalTexture),\n [128, 128, 255, 255]\n );\n const occlusionAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.occlusionTexture),\n [255, 255, 255, 255]\n );\n const emissiveAtlas = buildTextureAtlas(\n normalized.map((mesh) => mesh.emissiveTexture),\n [255, 255, 255, 255]\n );\n const extensionTextureNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n const extensionAtlases = Object.freeze(\n Object.fromEntries(\n extensionTextureNames.map((name) => [\n name,\n buildTextureAtlas(\n normalized.map((mesh) => mesh.extensionTextures?.[name]),\n [255, 255, 255, 255]\n ),\n ])\n )\n );\n const bytes = new ArrayBuffer(Math.max(1, normalized.length) * GPU_MATERIAL_RECORD_BYTES);\n const floatView = new Float32Array(bytes);\n\n normalized.forEach((mesh, meshIndex) => {\n const byteOffset = meshIndex * GPU_MATERIAL_RECORD_BYTES;\n writeVec4(floatView, byteOffset, mesh.color);\n writeVec4(floatView, byteOffset + 16, mesh.emission);\n writeVec4(floatView, byteOffset + 32, [\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]);\n writeVec4(floatView, byteOffset + 48, [\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]);\n writeVec4(floatView, byteOffset + 64, [\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]);\n writeVec4(floatView, byteOffset + 80, [\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]);\n writeVec4(floatView, byteOffset + 96, baseColorAtlas.resolveRect(mesh.baseColorTexture));\n writeVec4(\n floatView,\n byteOffset + 112,\n metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n );\n writeVec4(floatView, byteOffset + 128, normalAtlas.resolveRect(mesh.normalTexture));\n writeVec4(floatView, byteOffset + 144, occlusionAtlas.resolveRect(mesh.occlusionTexture));\n writeVec4(floatView, byteOffset + 160, emissiveAtlas.resolveRect(mesh.emissiveTexture));\n writeVec4(floatView, byteOffset + 176, [\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]);\n });\n\n return Object.freeze({\n buffer: bytes,\n count: normalized.length,\n recordBytes: GPU_MATERIAL_RECORD_BYTES,\n records: Object.freeze(normalized),\n baseColorAtlas,\n metallicRoughnessAtlas,\n normalAtlas,\n occlusionAtlas,\n emissiveAtlas,\n extensionAtlases,\n });\n}\n\nexport function estimateBvhLeafSortCapacity(triangleCount) {\n return triangleCount <= 0 ? 0 : nextPowerOfTwo(triangleCount);\n}\n\nexport function createWavefrontBvhSortStages(itemCountInput) {\n const itemCount = readNonNegativeInteger(\"itemCount\", itemCountInput, 0);\n const sortCount = estimateBvhLeafSortCapacity(itemCount);\n if (sortCount <= 1) {\n return Object.freeze([]);\n }\n\n const stages = [];\n for (let sequenceSize = 2; sequenceSize <= sortCount; sequenceSize *= 2) {\n for (\n let compareDistance = sequenceSize / 2;\n compareDistance >= 1;\n compareDistance /= 2\n ) {\n stages.push(\n Object.freeze({\n compareDistance,\n sequenceSize,\n })\n );\n }\n }\n\n return Object.freeze(stages);\n}\n\nexport function createWavefrontBvhBuildLevels(triangleCountInput) {\n const triangleCount = readNonNegativeInteger(\"triangleCount\", triangleCountInput, 0);\n const internalCount = Math.max(0, triangleCount - 1);\n if (internalCount === 0) {\n return Object.freeze([]);\n }\n\n const levels = [];\n let depth = 0;\n while (Math.pow(2, depth) - 1 < internalCount) {\n depth += 1;\n }\n\n for (let level = depth - 1; level >= 0; level -= 1) {\n const start = Math.pow(2, level) - 1;\n const end = Math.min(Math.pow(2, level + 1) - 2, internalCount - 1);\n if (end >= start) {\n levels.push(\n Object.freeze({\n start,\n count: end - start + 1,\n })\n );\n }\n }\n\n return Object.freeze(levels);\n}\n\nexport function resolveAccelerationBuildMode(options = {}) {\n const requestedMode =\n options.accelerationBuildMode ?? (options.displayQuality === true ? \"cpu-upload\" : \"cpu-debug\");\n const mode = requestedMode === \"cpu-debug\" ? \"cpu-upload\" : requestedMode;\n if (mode !== \"gpu\" && mode !== \"cpu-upload\") {\n throw new Error(\n \"accelerationBuildMode must be either \\\"gpu\\\", \\\"cpu-upload\\\", or the legacy alias \\\"cpu-debug\\\".\"\n );\n }\n return mode;\n}\n\nexport function createWavefrontGpuMeshSource(meshes = [], gpuMaterialSourceInput = null) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const gpuMaterialSource = gpuMaterialSourceInput ?? createWavefrontGpuMaterialSource(normalized);\n const vertexCount = normalized.reduce((count, mesh) => count + mesh.positions.length / 3, 0);\n const indexCount = normalized.reduce((count, mesh) => count + mesh.indices.length, 0);\n const triangleCount = Math.floor(indexCount / 3);\n const vertexBytes = new ArrayBuffer(Math.max(1, vertexCount) * MESH_VERTEX_RECORD_BYTES);\n const indexBytes = new ArrayBuffer(Math.max(1, indexCount) * 4);\n const meshBytes = new ArrayBuffer(Math.max(1, normalized.length) * MESH_RANGE_RECORD_BYTES);\n const vertexFloats = new Float32Array(vertexBytes);\n const indexUints = new Uint32Array(indexBytes);\n const meshUints = new Uint32Array(meshBytes);\n const meshFloats = new Float32Array(meshBytes);\n\n let vertexCursor = 0;\n let indexCursor = 0;\n let triangleCursor = 0;\n\n normalized.forEach((mesh, meshIndex) => {\n const meshVertexBase = vertexCursor;\n const meshIndexBase = indexCursor;\n const meshTriangleBase = triangleCursor;\n const meshVertexCount = mesh.positions.length / 3;\n\n for (let vertexIndex = 0; vertexIndex < meshVertexCount; vertexIndex += 1) {\n const recordOffset = (vertexCursor + vertexIndex) * (MESH_VERTEX_RECORD_BYTES / 4);\n const position = readVector(mesh.positions, vertexIndex, 3, [0, 0, 0]);\n const normal = mesh.normals ? readVector(mesh.normals, vertexIndex, 3, [0, 0, 0]) : [0, 0, 0];\n const uv = mesh.uvs ? readVector2(mesh.uvs, vertexIndex) : [0, 0];\n vertexFloats[recordOffset] = position[0];\n vertexFloats[recordOffset + 1] = position[1];\n vertexFloats[recordOffset + 2] = position[2];\n vertexFloats[recordOffset + 3] = 1;\n vertexFloats[recordOffset + 4] = normal[0];\n vertexFloats[recordOffset + 5] = normal[1];\n vertexFloats[recordOffset + 6] = normal[2];\n vertexFloats[recordOffset + 7] = mesh.normals ? 1 : 0;\n vertexFloats[recordOffset + 8] = uv[0];\n vertexFloats[recordOffset + 9] = uv[1];\n vertexFloats[recordOffset + 10] = mesh.uvs ? 1 : 0;\n vertexFloats[recordOffset + 11] = 0;\n }\n\n mesh.indices.forEach((indexValue, localIndex) => {\n indexUints[indexCursor + localIndex] = meshVertexBase + indexValue;\n });\n\n const meshOffset = meshIndex * (MESH_RANGE_RECORD_BYTES / 4);\n meshUints[meshOffset] = mesh.id;\n meshUints[meshOffset + 1] = mesh.materialKind;\n meshUints[meshOffset + 2] = mesh.flags;\n meshUints[meshOffset + 3] = mesh.materialRefId;\n meshUints[meshOffset + 4] = mesh.mediumRefId;\n meshUints[meshOffset + 5] = meshIndexBase;\n meshUints[meshOffset + 6] = mesh.indices.length;\n meshUints[meshOffset + 7] = meshTriangleBase;\n meshUints[meshOffset + 8] = mesh.indices.length / 3;\n meshUints[meshOffset + 9] = meshVertexBase;\n meshUints[meshOffset + 10] = meshVertexCount;\n meshUints[meshOffset + 11] = meshIndex;\n const floatOffset = meshOffset;\n writeVec4(meshFloats, floatOffset * 4 + 48, mesh.color);\n writeVec4(meshFloats, floatOffset * 4 + 64, mesh.emission);\n writeVec4(meshFloats, floatOffset * 4 + 80, [\n mesh.roughness,\n mesh.metallic,\n mesh.opacity,\n mesh.ior,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 96, [\n mesh.sheenColor[0] ?? 0,\n mesh.sheenColor[1] ?? 0,\n mesh.sheenColor[2] ?? 0,\n mesh.clearcoat,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 112, [\n mesh.clearcoatRoughness,\n mesh.specular,\n mesh.transmission,\n mesh.thickness,\n ]);\n writeVec4(meshFloats, floatOffset * 4 + 128, [\n mesh.specularColor[0] ?? 1,\n mesh.specularColor[1] ?? 1,\n mesh.specularColor[2] ?? 1,\n 1,\n ]);\n writeVec4(\n meshFloats,\n floatOffset * 4 + 144,\n gpuMaterialSource.baseColorAtlas.resolveRect(mesh.baseColorTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 160,\n gpuMaterialSource.metallicRoughnessAtlas.resolveRect(mesh.metallicRoughnessTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 176,\n gpuMaterialSource.normalAtlas.resolveRect(mesh.normalTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 192,\n gpuMaterialSource.occlusionAtlas.resolveRect(mesh.occlusionTexture)\n );\n writeVec4(\n meshFloats,\n floatOffset * 4 + 208,\n gpuMaterialSource.emissiveAtlas.resolveRect(mesh.emissiveTexture)\n );\n writeVec4(meshFloats, floatOffset * 4 + 224, [\n clampUnit(mesh.normalTexture?.scale ?? mesh.normalTexture?.strength ?? 1),\n clampUnit(mesh.occlusionTexture?.strength ?? 1),\n clampUnit(mesh.emissiveTexture?.strength ?? 1),\n 0,\n ]);\n\n vertexCursor += meshVertexCount;\n indexCursor += mesh.indices.length;\n triangleCursor += mesh.indices.length / 3;\n });\n\n return Object.freeze({\n vertices: Object.freeze({\n buffer: vertexBytes,\n count: vertexCount,\n recordBytes: MESH_VERTEX_RECORD_BYTES,\n }),\n indices: Object.freeze({\n buffer: indexBytes,\n count: indexCount,\n recordBytes: 4,\n }),\n meshes: Object.freeze({\n buffer: meshBytes,\n records: Object.freeze(normalized),\n count: normalized.length,\n recordBytes: MESH_RANGE_RECORD_BYTES,\n }),\n triangleCount,\n bvhNodeCapacity: estimateBinaryBvhNodeCapacity(triangleCount),\n });\n}\n\nexport function createWavefrontEmissiveTriangleIndexSource(meshes = [], capacityInput) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const normalized = source.map((meshInput, meshIndex) => normalizeWavefrontMesh(meshInput, meshIndex));\n const indices = [];\n let triangleCursor = 0;\n\n normalized.forEach((mesh) => {\n const triangleCount = Math.floor(mesh.indices.length / 3);\n const isEmissive =\n mesh.materialKind === MATERIAL_EMISSIVE || emissionPower(mesh.emission) > 0.0001;\n if (isEmissive) {\n for (let triangleOffset = 0; triangleOffset < triangleCount; triangleOffset += 1) {\n indices.push(triangleCursor + triangleOffset);\n }\n }\n triangleCursor += triangleCount;\n });\n\n const capacity = Math.max(\n indices.length,\n readNonNegativeInteger(\"emissiveTriangleCapacity\", capacityInput, indices.length)\n );\n const bytes = new ArrayBuffer(capacity * EMISSIVE_TRIANGLE_INDEX_BYTES);\n const uints = new Uint32Array(bytes);\n uints.fill(0xffffffff);\n indices.forEach((triangleIndex, index) => {\n uints[index] = triangleIndex;\n });\n\n return Object.freeze({\n buffer: bytes,\n indices: Object.freeze(indices),\n count: indices.length,\n capacity,\n recordBytes: EMISSIVE_TRIANGLE_INDEX_BYTES,\n });\n}\n","import {\n BVH_NODE_RECORD_BYTES,\n CONFIG_BUFFER_BYTES,\n COUNTER_DISPATCH_ARGS_OFFSET,\n HIT_TYPE_EMISSIVE,\n HIT_TYPE_SURFACE,\n MESH_RANGE_RECORD_BYTES,\n SCENE_OBJECT_RECORD_BYTES,\n TRIANGLE_RECORD_BYTES,\n clamp,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport { normalizeSceneObjects } from \"./wavefront-scene-data.js\";\n\nexport function packWavefrontSceneObjects(sceneObjects, capacity = sceneObjects.length) {\n const normalized =\n Array.isArray(sceneObjects) && sceneObjects.length === 0\n ? []\n : normalizeSceneObjects(sceneObjects);\n if (normalized.length > capacity) {\n throw new Error(\n `Scene object capacity ${capacity} is too small for ${normalized.length} objects.`\n );\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * SCENE_OBJECT_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n normalized.forEach((object, index) => {\n const byteOffset = index * SCENE_OBJECT_RECORD_BYTES;\n const u32 = byteOffset / 4;\n uintView[u32] = object.kind;\n uintView[u32 + 1] = object.id;\n uintView[u32 + 2] = object.materialKind;\n uintView[u32 + 3] = object.flags;\n uintView[u32 + 4] = object.mediumRefId;\n writeVec4(floatView, byteOffset + 32, [...object.center, 0]);\n writeVec4(floatView, byteOffset + 48, [...object.halfExtent, 0]);\n writeVec4(floatView, byteOffset + 64, object.color);\n writeVec4(floatView, byteOffset + 80, object.emission);\n writeVec4(floatView, byteOffset + 96, [\n object.roughness,\n object.metallic,\n object.opacity,\n object.ior,\n ]);\n writeVec4(floatView, byteOffset + 112, [\n object.sheenColor[0] ?? 0,\n object.sheenColor[1] ?? 0,\n object.sheenColor[2] ?? 0,\n object.clearcoat,\n ]);\n writeVec4(floatView, byteOffset + 128, [\n object.clearcoatRoughness,\n object.specular,\n object.transmission,\n object.thickness,\n ]);\n writeVec4(floatView, byteOffset + 144, [\n object.specularColor[0] ?? 1,\n object.specularColor[1] ?? 1,\n object.specularColor[2] ?? 1,\n 1,\n ]);\n });\n\n return Object.freeze({\n buffer: bytes,\n objects: Object.freeze(normalized),\n count: normalized.length,\n capacity,\n });\n}\n\nexport function packWavefrontTriangles(triangles, capacity = triangles.length) {\n if (triangles.length > capacity) {\n throw new Error(`Triangle capacity ${capacity} is too small for ${triangles.length} triangles.`);\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * TRIANGLE_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n triangles.forEach((triangle, index) => {\n const byteOffset = index * TRIANGLE_RECORD_BYTES;\n const u32 = byteOffset / 4;\n uintView[u32] = triangle.triangleId;\n uintView[u32 + 1] = triangle.meshId;\n uintView[u32 + 2] = triangle.materialKind;\n uintView[u32 + 3] = triangle.flags;\n uintView[u32 + 4] = triangle.materialRefId;\n uintView[u32 + 5] = triangle.mediumRefId;\n uintView[u32 + 6] = triangle.materialSlot ?? 0;\n uintView[u32 + 7] = 0;\n writeVec4(floatView, byteOffset + 32, [...triangle.v0, 0]);\n writeVec4(floatView, byteOffset + 48, [...triangle.v1, 0]);\n writeVec4(floatView, byteOffset + 64, [...triangle.v2, 0]);\n writeVec4(floatView, byteOffset + 80, [...triangle.n0, 0]);\n writeVec4(floatView, byteOffset + 96, [...triangle.n1, 0]);\n writeVec4(floatView, byteOffset + 112, [...triangle.n2, 0]);\n writeVec4(floatView, byteOffset + 128, [...triangle.uv0, ...triangle.uv1]);\n writeVec4(floatView, byteOffset + 144, [...triangle.uv2, 0, 0]);\n writeVec4(floatView, byteOffset + 160, triangle.color);\n writeVec4(floatView, byteOffset + 176, triangle.emission);\n writeVec4(floatView, byteOffset + 192, triangle.material);\n writeVec4(floatView, byteOffset + 208, triangle.materialResponse);\n writeVec4(floatView, byteOffset + 224, triangle.materialExtension ?? [0.08, 1, 0, 0]);\n writeVec4(floatView, byteOffset + 240, triangle.specularColor ?? [1, 1, 1, 1]);\n writeVec4(floatView, byteOffset + 256, triangle.baseColorAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 272, triangle.metallicRoughnessAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 288, triangle.normalAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 304, triangle.occlusionAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 320, triangle.emissiveAtlas ?? [0, 0, 1, 1]);\n writeVec4(floatView, byteOffset + 336, triangle.textureSettings ?? [1, 1, 1, 0]);\n writeVec4(floatView, byteOffset + 352, triangle.materialExtension2 ?? [0, 0, 1.3, 0]);\n writeVec4(floatView, byteOffset + 368, triangle.materialExtension3 ?? [100, 400, 0, 0]);\n const extensionTextureNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n extensionTextureNames.forEach((name, extensionIndex) => {\n writeVec4(\n floatView,\n byteOffset + 384 + extensionIndex * 16,\n triangle.extensionTextures?.[name] ?? [0, 0, 1, 1]\n );\n });\n });\n\n return Object.freeze({\n buffer: bytes,\n triangles: Object.freeze(triangles),\n count: triangles.length,\n capacity,\n });\n}\n\nexport function packWavefrontBvhNodes(nodes, capacity = nodes.length) {\n if (nodes.length > capacity) {\n throw new Error(`BVH node capacity ${capacity} is too small for ${nodes.length} nodes.`);\n }\n\n const bytes = new ArrayBuffer(Math.max(1, capacity) * BVH_NODE_RECORD_BYTES);\n const uintView = new Uint32Array(bytes);\n const floatView = new Float32Array(bytes);\n\n nodes.forEach((node, index) => {\n const byteOffset = index * BVH_NODE_RECORD_BYTES;\n const u32 = byteOffset / 4;\n writeVec4(floatView, byteOffset, [...node.bounds.min, 0]);\n writeVec4(floatView, byteOffset + 16, [...node.bounds.max, 0]);\n uintView[u32 + 8] = node.triangleCount > 0 ? node.firstTriangle : node.leftChild;\n uintView[u32 + 9] = node.triangleCount;\n uintView[u32 + 10] = node.rightChild;\n uintView[u32 + 11] = 0;\n });\n\n return Object.freeze({\n buffer: bytes,\n nodes: Object.freeze(nodes),\n count: nodes.length,\n capacity,\n });\n}\n\nexport function createConfigPayload(config, tile, frameIndex, buildRange = {}) {\n const bytes = new ArrayBuffer(CONFIG_BUFFER_BYTES);\n const data = new DataView(bytes);\n const floatView = new Float32Array(bytes);\n const sampleIndex = buildRange.sampleIndex ?? 0;\n const sampleWeight = buildRange.sampleWeight ?? 1;\n data.setUint32(0, config.width, true);\n data.setUint32(4, config.height, true);\n data.setUint32(8, tile.x, true);\n data.setUint32(12, tile.y, true);\n data.setUint32(16, tile.width, true);\n data.setUint32(20, tile.height, true);\n data.setUint32(24, tile.width * tile.height, true);\n data.setUint32(28, config.maxDepth, true);\n data.setUint32(32, config.sceneObjectCount, true);\n data.setUint32(36, frameIndex, true);\n data.setUint32(40, config.denoise ? 1 : 0, true);\n data.setUint32(44, config.triangleCount, true);\n data.setUint32(48, config.bvhNodeCount, true);\n data.setUint32(52, config.displayQuality ? 1 : 0, true);\n data.setUint32(56, config.gpuMeshSource.meshes.count, true);\n data.setUint32(60, config.bvhNodeCapacity, true);\n writeVec4(floatView, 64, [...config.camera.position, 1]);\n writeVec4(floatView, 80, [...config.camera.forward, 0]);\n writeVec4(floatView, 96, [...config.camera.right, 0]);\n writeVec4(floatView, 112, [...config.camera.up, 0]);\n writeVec4(floatView, 128, [\n config.camera.tanHalfFovY,\n config.camera.aspect,\n sampleWeight,\n sampleIndex,\n ]);\n writeVec4(floatView, 144, config.environmentColor);\n writeVec4(floatView, 160, config.ambientColor);\n writeVec4(floatView, 176, config.environmentLighting.horizonColor);\n writeVec4(floatView, 192, config.environmentLighting.zenithColor);\n writeVec4(floatView, 208, [\n ...config.environmentLighting.sunDirection,\n config.environmentLighting.intensity,\n ]);\n writeVec4(floatView, 224, config.environmentLighting.sunColor);\n data.setUint32(240, buildRange.start ?? 0, true);\n data.setUint32(244, buildRange.count ?? 0, true);\n data.setUint32(248, buildRange.sortItemCount ?? 0, true);\n data.setUint32(252, config.emissiveTriangleCount ?? 0, true);\n data.setUint32(256, config.environmentPortalCount ?? 0, true);\n data.setUint32(260, config.environmentPortalMode ?? 0, true);\n data.setUint32(264, config.samplesPerPixel, true);\n data.setUint32(268, config.transportExperimentFlags ?? 0, true);\n writeVec4(floatView, 272, [\n config.environmentMap.enabled ? 1 : 0,\n config.environmentMap.intensity,\n config.environmentMap.rotationRadians,\n config.environmentMap.ambientStrength,\n ]);\n writeVec4(floatView, 288, [\n config.deferredPathResolve ? 1 : 0,\n config.environmentLighting.sunlitBaseline,\n config.strictPhysicalLowSppLighting ? 1 : 0,\n config.presentationOutput === \"linear\" ? 1 : 0,\n ]);\n writeVec4(floatView, 304, [\n config.environmentMap.width ?? 1,\n config.environmentMap.height ?? 1,\n config.environmentMap.mipLevelCount ?? 1,\n config.environmentMap.hasImportanceData ? 1 : 0,\n ]);\n return bytes;\n}\n\nexport function createTiles(width, height, tileSize) {\n const tiles = [];\n for (let y = 0; y < height; y += tileSize) {\n for (let x = 0; x < width; x += tileSize) {\n tiles.push(\n Object.freeze({\n x,\n y,\n width: Math.min(tileSize, width - x),\n height: Math.min(tileSize, height - y),\n })\n );\n }\n }\n return Object.freeze(tiles);\n}\n","import { recordDirectDispatch } from \"./wavefront-frame-runtime.js\";\nimport { createConfigPayload } from \"./wavefront-packers.js\";\nimport { WORKGROUP_SIZE } from \"./wavefront-core.js\";\n\nexport function dispatchWavefrontGpuAccelerationBuild({\n config,\n accelerationBuilt,\n tiles,\n device,\n bvhBuildConfigBuffer,\n configBufferStride,\n bvhBuildBindGroup,\n pipelines,\n parallelism,\n frameIndex,\n}) {\n if (!config.gpuAccelerationBuildRequired || accelerationBuilt) {\n return false;\n }\n const buildTile = tiles[0] ?? { x: 0, y: 0, width: 1, height: 1 };\n const encoder = device.createCommandEncoder({\n label: `plasius.wavefront.buildAcceleration.${frameIndex}`,\n });\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n 0,\n createConfigPayload(config, buildTile, frameIndex, {\n sortItemCount: config.bvhLeafSortCapacity,\n })\n );\n config.bvhSortStages.forEach((sortStage, stageIndex) => {\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n (stageIndex + 1) * configBufferStride,\n createConfigPayload(config, buildTile, frameIndex, {\n start: sortStage.compareDistance,\n count: sortStage.sequenceSize,\n sortItemCount: config.bvhLeafSortCapacity,\n })\n );\n });\n const buildLevelConfigStart = 1 + config.bvhSortStages.length;\n config.bvhBuildLevels.forEach((buildLevel, levelIndex) => {\n device.queue.writeBuffer(\n bvhBuildConfigBuffer,\n (buildLevelConfigStart + levelIndex) * configBufferStride,\n createConfigPayload(config, buildTile, frameIndex, buildLevel)\n );\n });\n const passEncoder = encoder.beginComputePass({\n label: \"plasius.wavefront.buildAccelerationPass\",\n });\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [0]);\n passEncoder.setPipeline(pipelines.prepareMeshTrianglesAndLeaves);\n const prepareWorkgroups = Math.ceil(config.bvhLeafSortCapacity / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(prepareWorkgroups);\n recordDirectDispatch(parallelism, [prepareWorkgroups], WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.sortBvhLeafRefs);\n for (let stageIndex = 0; stageIndex < config.bvhSortStages.length; stageIndex += 1) {\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [\n (stageIndex + 1) * configBufferStride,\n ]);\n const sortWorkgroups = Math.ceil(config.bvhLeafSortCapacity / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(sortWorkgroups);\n recordDirectDispatch(parallelism, [sortWorkgroups], WORKGROUP_SIZE);\n }\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [0]);\n passEncoder.setPipeline(pipelines.writeSortedBvhLeaves);\n const leafWriteWorkgroups = Math.ceil(config.triangleCount / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(leafWriteWorkgroups);\n recordDirectDispatch(parallelism, [leafWriteWorkgroups], WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.buildBvhInternalLevel);\n for (let levelIndex = 0; levelIndex < config.bvhBuildLevels.length; levelIndex += 1) {\n const buildLevel = config.bvhBuildLevels[levelIndex];\n passEncoder.setBindGroup(0, bvhBuildBindGroup, [\n (buildLevelConfigStart + levelIndex) * configBufferStride,\n ]);\n const levelWorkgroups = Math.ceil(buildLevel.count / WORKGROUP_SIZE);\n passEncoder.dispatchWorkgroups(levelWorkgroups);\n recordDirectDispatch(parallelism, [levelWorkgroups], WORKGROUP_SIZE);\n }\n passEncoder.end();\n device.queue.submit([encoder.finish()]);\n return true;\n}\n","import {\n ACCUMULATION_RECORD_BYTES,\n BVH_LEAF_REF_RECORD_BYTES,\n BVH_NODE_RECORD_BYTES,\n CONFIG_BUFFER_BYTES,\n COUNTER_BUFFER_BYTES,\n DEFAULT_AMBIENT_COLOR,\n DEFAULT_CAMERA,\n DEFAULT_ENVIRONMENT_COLOR,\n DEFAULT_ENVIRONMENT_LIGHTING,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY,\n DEFAULT_HEIGHT,\n DEFAULT_MAX_DEPTH,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION,\n DEFAULT_SAMPLES_PER_PIXEL,\n DEFAULT_SCENE_OBJECT_CAPACITY,\n DEFAULT_TILE_SIZE,\n DEFAULT_WIDTH,\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n EMPTY_TERMINATION_METRICS,\n ENVIRONMENT_PORTAL_RECORD_BYTES,\n HIT_RECORD_BYTES,\n INDIRECT_DISPATCH_ARGS_BYTES,\n MAX_PATH_TRACING_DEPTH,\n MAX_SAMPLES_PER_PIXEL,\n MESH_RANGE_RECORD_BYTES,\n MESH_VERTEX_RECORD_BYTES,\n PATH_VERTEX_RECORD_BYTES,\n RAY_RECORD_BYTES,\n SCENE_OBJECT_RECORD_BYTES,\n TRIANGLE_RECORD_BYTES,\n WORKGROUP_SIZE,\n add,\n asColor,\n asUnitVec3,\n asVec3,\n assertAnalyticDisplayQualityPolicy,\n clamp,\n cross,\n dot,\n normalize,\n readFiniteNumber,\n readNonNegativeInteger,\n readPositiveInteger,\n rendererWavefrontComputeMode,\n resolveDeferredPathResolve,\n resolveEnvironmentMap,\n resolveStrictPhysicalLowSppLighting,\n resolveTransportExperiments,\n resolveWavefrontPresentationOutput,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport { writeVec4 } from \"./wavefront-binary.js\";\nimport {\n collectWavefrontMediums,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n estimateBinaryBvhNodeCapacity,\n estimateBvhLeafSortCapacity,\n estimateMeshSourceShape,\n normalizeMeshes,\n normalizeSceneObjects,\n resolveAccelerationBuildMode,\n} from \"./wavefront-scene-data.js\";\n\nconst WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 256;\n\nfunction allocatedRecordBytes(count, recordBytes) {\n return Math.max(1, count) * recordBytes;\n}\n\nfunction alignByteSize(value, alignment) {\n return Math.ceil(value / alignment) * alignment;\n}\n\nfunction resolveEnvironmentLighting(input, environmentColor, ambientColor) {\n const source = input ?? {};\n return Object.freeze({\n environmentColor: Object.freeze(asColor(source.environmentColor, environmentColor)),\n ambientColor: Object.freeze(asColor(source.ambientColor, ambientColor)),\n horizonColor: Object.freeze(asColor(source.horizonColor, environmentColor)),\n zenithColor: Object.freeze(asColor(source.zenithColor, DEFAULT_ENVIRONMENT_LIGHTING.zenithColor)),\n sunDirection: Object.freeze(asUnitVec3(source.sunDirection, DEFAULT_ENVIRONMENT_LIGHTING.sunDirection)),\n sunColor: Object.freeze(asColor(source.sunColor, DEFAULT_ENVIRONMENT_LIGHTING.sunColor)),\n intensity: Math.max(0.0001, readFiniteNumber(\"environmentLighting.intensity\", source.intensity, DEFAULT_ENVIRONMENT_LIGHTING.intensity)),\n mode: readNonNegativeInteger(\"environmentLighting.mode\", source.mode, DEFAULT_ENVIRONMENT_LIGHTING.mode),\n exposure: Math.max(0.0001, readFiniteNumber(\"environmentLighting.exposure\", source.exposure, DEFAULT_ENVIRONMENT_LIGHTING.exposure)),\n sunlitBaseline: Math.max(\n 0,\n readFiniteNumber(\n \"environmentLighting.sunlitBaseline\",\n source.sunlitBaseline ?? source.daylightBaseline,\n DEFAULT_ENVIRONMENT_LIGHTING.sunlitBaseline\n )\n ),\n });\n}\n\nfunction resolveEnvironmentPortalMode(value, hasPortals) {\n if (value === undefined || value === null) {\n return hasPortals ? 2 : 0;\n }\n if (Number.isInteger(value) && value >= 0 && value <= 2) {\n return value;\n }\n if (value === \"disabled\") {\n return 0;\n }\n if (value === \"guide\") {\n return 1;\n }\n if (value === \"guide-and-gate\" || value === \"gate\") {\n return 2;\n }\n throw new Error(\n \"environmentPortalMode must be disabled, guide, guide-and-gate, or an integer between 0 and 2.\"\n );\n}\n\nfunction orthogonalPortalTangent(normal) {\n if (Math.abs(normal[1]) < 0.92) {\n return normalize(cross([0, 1, 0], normal), [1, 0, 0]);\n }\n return normalize(cross([1, 0, 0], normal), [0, 0, 1]);\n}\n\nfunction resolvePortalTangent(value, normal) {\n const fallback = orthogonalPortalTangent(normal);\n const tangent = asUnitVec3(value, fallback);\n const projected = subtract(tangent, scale(normal, dot(tangent, normal)));\n return normalize(projected, fallback);\n}\n\nfunction readPositiveFiniteNumber(name, value, fallback) {\n const numeric = readFiniteNumber(name, value, fallback);\n if (numeric <= 0) {\n throw new Error(`${name} must be a positive finite number.`);\n }\n return numeric;\n}\n\nfunction readPortalExtent(name, value, halfName, halfValue) {\n if (value !== undefined && value !== null) {\n return readPositiveFiniteNumber(name, value, 1);\n }\n return readPositiveFiniteNumber(halfName, halfValue, 0.5) * 2;\n}\n\nfunction normalizeEnvironmentPortal(portal, index) {\n if (!portal || typeof portal !== \"object\") {\n throw new Error(`environmentPortals[${index}] must be an object.`);\n }\n const shape = portal.shape ?? portal.kind ?? \"rectangle\";\n if (shape !== \"rectangle\") {\n throw new Error(`environmentPortals[${index}].shape must be \"rectangle\".`);\n }\n const position = asVec3(portal.position ?? portal.center, [0, 0, 0]);\n const normal = asUnitVec3(portal.normal, [0, 0, 1]);\n const tangent = resolvePortalTangent(portal.tangent, normal);\n const bitangent = normalize(cross(normal, tangent), [0, 1, 0]);\n const width = readPortalExtent(\n `environmentPortals[${index}].width`,\n portal.width,\n `environmentPortals[${index}].halfWidth`,\n portal.halfWidth\n );\n const height = readPortalExtent(\n `environmentPortals[${index}].height`,\n portal.height,\n `environmentPortals[${index}].halfHeight`,\n portal.halfHeight\n );\n const radianceScale = Math.max(\n 0,\n readFiniteNumber(\n `environmentPortals[${index}].radianceScale`,\n portal.radianceScale ?? portal.intensity,\n 1\n )\n );\n return Object.freeze({\n kind: 1,\n flags: portal.twoSided === false ? 0 : 1,\n position: Object.freeze([position[0], position[1], position[2], width * height]),\n normal: Object.freeze([normal[0], normal[1], normal[2], radianceScale]),\n tangent: Object.freeze([tangent[0], tangent[1], tangent[2], width * 0.5]),\n bitangent: Object.freeze([bitangent[0], bitangent[1], bitangent[2], height * 0.5]),\n color: Object.freeze(asColor(portal.color, [1, 1, 1, 1])),\n });\n}\n\nfunction normalizeEnvironmentPortals(value) {\n if (value === undefined || value === null) {\n return Object.freeze([]);\n }\n if (!Array.isArray(value)) {\n throw new Error(\"environmentPortals must be an array when provided.\");\n }\n return Object.freeze(value.map(normalizeEnvironmentPortal));\n}\n\nexport function packEnvironmentPortals(portals, capacity) {\n const bytes = new ArrayBuffer(capacity * ENVIRONMENT_PORTAL_RECORD_BYTES);\n const data = new DataView(bytes);\n const floatView = new Float32Array(bytes);\n portals.forEach((portal, index) => {\n const byteOffset = index * ENVIRONMENT_PORTAL_RECORD_BYTES;\n const floatOffset = byteOffset / Float32Array.BYTES_PER_ELEMENT;\n data.setUint32(byteOffset, portal.kind, true);\n data.setUint32(byteOffset + 4, portal.flags, true);\n data.setUint32(byteOffset + 8, 0, true);\n data.setUint32(byteOffset + 12, 0, true);\n writeVec4(floatView, floatOffset + 4, portal.position);\n writeVec4(floatView, floatOffset + 8, portal.normal);\n writeVec4(floatView, floatOffset + 12, portal.tangent);\n writeVec4(floatView, floatOffset + 16, portal.bitangent);\n writeVec4(floatView, floatOffset + 20, portal.color);\n });\n return Object.freeze({\n buffer: bytes,\n portals,\n count: portals.length,\n capacity,\n recordBytes: ENVIRONMENT_PORTAL_RECORD_BYTES,\n });\n}\n\nfunction getCanvasDimension(canvas, key, fallback) {\n const value = Number(canvas?.[key]);\n if (Number.isFinite(value) && value > 0) {\n return Math.trunc(value);\n }\n return fallback;\n}\n\nfunction resolveCamera(input, width, height) {\n const camera = input ?? DEFAULT_CAMERA;\n const position = asVec3(camera.position, DEFAULT_CAMERA.position);\n const target = asVec3(camera.target, DEFAULT_CAMERA.target);\n const upInput = normalize(asVec3(camera.up, DEFAULT_CAMERA.up), DEFAULT_CAMERA.up);\n const forward = normalize(subtract(target, position), [0, 0, -1]);\n const right = normalize(cross(forward, upInput), [1, 0, 0]);\n const up = normalize(cross(right, forward), [0, 1, 0]);\n const fovYDegrees = clamp(\n readFiniteNumber(\"camera.fovYDegrees\", camera.fovYDegrees ?? camera.fov, DEFAULT_CAMERA.fovYDegrees),\n 10,\n 120\n );\n const aspect = width / Math.max(1, height);\n const tanHalfFovY = Math.tan((fovYDegrees * Math.PI) / 360);\n\n return Object.freeze({\n position: Object.freeze(position),\n forward: Object.freeze(forward),\n right: Object.freeze(right),\n up: Object.freeze(up),\n fovYDegrees,\n aspect,\n tanHalfFovY,\n });\n}\n\nexport function estimateWavefrontPathTracingMemory(options = {}) {\n const width = readPositiveInteger(\"width\", options.width, DEFAULT_WIDTH);\n const height = readPositiveInteger(\"height\", options.height, DEFAULT_HEIGHT);\n const tileSize = readPositiveInteger(\"tileSize\", options.tileSize, DEFAULT_TILE_SIZE);\n const samplesPerPixel = clamp(\n readPositiveInteger(\n \"samplesPerPixel\",\n options.samplesPerPixel,\n DEFAULT_SAMPLES_PER_PIXEL\n ),\n 1,\n MAX_SAMPLES_PER_PIXEL\n );\n const tilePixelCapacity = readPositiveInteger(\n \"tilePixelCapacity\",\n options.tilePixelCapacity,\n DEFAULT_TILE_SIZE * DEFAULT_TILE_SIZE\n );\n const maxDepth = clamp(\n readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH),\n 1,\n MAX_PATH_TRACING_DEPTH\n );\n const sceneObjectCapacity = readPositiveInteger(\n \"sceneObjectCapacity\",\n options.sceneObjectCapacity,\n DEFAULT_SCENE_OBJECT_CAPACITY\n );\n const triangleCapacity = readNonNegativeInteger(\"triangleCapacity\", options.triangleCapacity, 0);\n const bvhNodeCapacity = readNonNegativeInteger(\"bvhNodeCapacity\", options.bvhNodeCapacity, 0);\n const bvhLeafSortCapacity = readNonNegativeInteger(\n \"bvhLeafSortCapacity\",\n options.bvhLeafSortCapacity,\n 0\n );\n const emissiveTriangleCapacity = readNonNegativeInteger(\n \"emissiveTriangleCapacity\",\n options.emissiveTriangleCapacity,\n 0\n );\n const environmentPortalCapacity = readNonNegativeInteger(\n \"environmentPortalCapacity\",\n options.environmentPortalCapacity,\n 0\n );\n readNonNegativeInteger(\"materialCapacity\", options.materialCapacity, 0);\n const meshVertexCount = readNonNegativeInteger(\n \"meshVertexCount\",\n options.meshVertexCount,\n 0\n );\n const meshIndexCount = readNonNegativeInteger(\n \"meshIndexCount\",\n options.meshIndexCount,\n 0\n );\n const meshRangeCount = readNonNegativeInteger(\n \"meshRangeCount\",\n options.meshRangeCount,\n 0\n );\n const bvhSortStageCount = readNonNegativeInteger(\n \"bvhSortStageCount\",\n options.bvhSortStageCount,\n 0\n );\n const bvhBuildLevelCount = readNonNegativeInteger(\n \"bvhBuildLevelCount\",\n options.bvhBuildLevelCount,\n 0\n );\n const minUniformBufferOffsetAlignment = readPositiveInteger(\n \"minUniformBufferOffsetAlignment\",\n options.minUniformBufferOffsetAlignment,\n WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT\n );\n const denoise = options.denoise !== false;\n const deferredPathResolve = options.deferredPathResolve !== false;\n const queueBytes = tilePixelCapacity * RAY_RECORD_BYTES;\n const hitBytes = tilePixelCapacity * HIT_RECORD_BYTES;\n const accumulationBytes = tilePixelCapacity * ACCUMULATION_RECORD_BYTES;\n const pathVertexBytes = tilePixelCapacity * (maxDepth + 1) * PATH_VERTEX_RECORD_BYTES;\n const sceneObjectBytes = sceneObjectCapacity * SCENE_OBJECT_RECORD_BYTES;\n const triangleBytes = allocatedRecordBytes(triangleCapacity, TRIANGLE_RECORD_BYTES);\n const materialTableBytes = 0;\n const bvhNodeBytes = bvhNodeCapacity * BVH_NODE_RECORD_BYTES;\n const bvhLeafReferenceBytes = allocatedRecordBytes(\n bvhLeafSortCapacity,\n BVH_LEAF_REF_RECORD_BYTES\n );\n const emissiveTriangleMetadataBytes =\n emissiveTriangleCapacity * BVH_NODE_RECORD_BYTES;\n const bvhCombinedBytes = allocatedRecordBytes(\n bvhNodeCapacity + emissiveTriangleCapacity,\n BVH_NODE_RECORD_BYTES\n );\n const meshVertexBytes = allocatedRecordBytes(meshVertexCount, MESH_VERTEX_RECORD_BYTES);\n const meshIndexBytes = allocatedRecordBytes(meshIndexCount, 4);\n const meshRangeBytes = allocatedRecordBytes(meshRangeCount, MESH_RANGE_RECORD_BYTES);\n const environmentPortalBytes = allocatedRecordBytes(\n environmentPortalCapacity,\n ENVIRONMENT_PORTAL_RECORD_BYTES\n );\n const tileCount = Math.ceil(width / tileSize) * Math.ceil(height / tileSize);\n const outputConfigSlotCount = deferredPathResolve ? 0 : tileCount;\n const frameConfigSlotCount = Math.max(\n 1,\n tileCount * samplesPerPixel + outputConfigSlotCount + (denoise ? 1 : 0)\n );\n const configBufferStride = alignByteSize(\n CONFIG_BUFFER_BYTES,\n minUniformBufferOffsetAlignment\n );\n const frameConfigBytes = frameConfigSlotCount * configBufferStride;\n const bvhBuildConfigBytes = Math.max(\n 1,\n 1 + bvhSortStageCount + bvhBuildLevelCount\n ) * configBufferStride;\n const sceneStorageBufferBindingBytes = Math.max(\n sceneObjectBytes,\n triangleBytes,\n bvhCombinedBytes,\n meshVertexBytes,\n meshIndexBytes,\n meshRangeBytes,\n environmentPortalBytes,\n bvhLeafReferenceBytes\n );\n const totalHotBufferBytes =\n queueBytes * 2 +\n hitBytes +\n accumulationBytes +\n pathVertexBytes +\n sceneObjectBytes +\n triangleBytes +\n bvhCombinedBytes +\n meshVertexBytes +\n meshIndexBytes +\n meshRangeBytes +\n bvhLeafReferenceBytes +\n environmentPortalBytes +\n frameConfigBytes +\n bvhBuildConfigBytes +\n COUNTER_BUFFER_BYTES +\n INDIRECT_DISPATCH_ARGS_BYTES;\n\n return Object.freeze({\n queueBytes,\n queuePairBytes: queueBytes * 2,\n hitBytes,\n accumulationBytes,\n pathVertexBytes,\n sceneObjectBytes,\n triangleBytes,\n materialTableBytes,\n bvhNodeBytes,\n bvhCombinedBytes,\n bvhLeafReferenceBytes,\n emissiveTriangleMetadataBytes,\n meshVertexBytes,\n meshIndexBytes,\n meshRangeBytes,\n environmentPortalBytes,\n configBytes: CONFIG_BUFFER_BYTES,\n configBufferStride,\n frameConfigBytes,\n bvhBuildConfigBytes,\n counterBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n sceneStorageBufferBindingBytes,\n totalHotBufferBytes,\n });\n}\n\nexport function estimateWavefrontPathTracingMemoryForConfig(config, limits = {}) {\n return estimateWavefrontPathTracingMemory({\n width: config.width,\n height: config.height,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n tilePixelCapacity: config.tilePixelCapacity,\n maxDepth: config.maxDepth,\n sceneObjectCapacity: config.sceneObjectCapacity,\n triangleCapacity: config.triangleCapacity,\n bvhNodeCapacity: config.bvhNodeCapacity,\n bvhLeafSortCapacity: config.bvhLeafSortCapacity,\n emissiveTriangleCapacity: config.emissiveTriangleCapacity,\n environmentPortalCapacity: config.environmentPortalCapacity,\n meshVertexCount: config.gpuMeshSource.vertices.count,\n meshIndexCount: config.gpuMeshSource.indices.count,\n meshRangeCount: config.gpuMeshSource.meshes.count,\n bvhSortStageCount: config.bvhSortStages.length,\n bvhBuildLevelCount: config.bvhBuildLevels.length,\n denoise: config.denoise,\n deferredPathResolve: config.deferredPathResolve,\n minUniformBufferOffsetAlignment:\n limits.minUniformBufferOffsetAlignment ??\n WEBGPU_DEFAULT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT,\n });\n}\n\nexport function createWavefrontPathTracingComputeConfig(options = {}) {\n assertAnalyticDisplayQualityPolicy(options);\n const accelerationBuildMode = resolveAccelerationBuildMode(options);\n const canvas = options.canvas;\n const width = readPositiveInteger(\"width\", options.width, getCanvasDimension(canvas, \"width\", DEFAULT_WIDTH));\n const height = readPositiveInteger(\"height\", options.height, getCanvasDimension(canvas, \"height\", DEFAULT_HEIGHT));\n const maxDepth = clamp(\n readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH),\n 1,\n MAX_PATH_TRACING_DEPTH\n );\n const tileSize = clamp(readPositiveInteger(\"tileSize\", options.tileSize, DEFAULT_TILE_SIZE), 16, 512);\n const samplesPerPixel = clamp(\n readPositiveInteger(\"samplesPerPixel\", options.samplesPerPixel, DEFAULT_SAMPLES_PER_PIXEL),\n 1,\n MAX_SAMPLES_PER_PIXEL\n );\n const maxFramePassesPerSubmission = clamp(\n readPositiveInteger(\n \"maxFramePassesPerSubmission\",\n options.maxFramePassesPerSubmission,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION\n ),\n 1,\n 4096\n );\n const tilePixelCapacity = readPositiveInteger(\n \"tilePixelCapacity\",\n options.tilePixelCapacity,\n tileSize * tileSize\n );\n const meshes = normalizeMeshes(options);\n const meshSourceShape = estimateMeshSourceShape(meshes);\n const gpuMaterialSource =\n meshes.length > 0\n ? createWavefrontGpuMaterialSource(meshes)\n : createWavefrontGpuMaterialSource([]);\n const gpuMeshSource =\n meshes.length > 0\n ? createWavefrontGpuMeshSource(meshes, gpuMaterialSource)\n : createWavefrontGpuMeshSource([]);\n const meshAcceleration =\n accelerationBuildMode === \"cpu-upload\"\n ? createWavefrontMeshAcceleration(meshes, gpuMaterialSource)\n : Object.freeze({ nodes: Object.freeze([]), triangles: Object.freeze([]) });\n const emissiveTriangleIndices = createWavefrontEmissiveTriangleIndexSource(\n meshes,\n options.emissiveTriangleCapacity\n );\n const triangleCount =\n accelerationBuildMode === \"gpu\"\n ? meshSourceShape.triangleCount\n : meshAcceleration.triangles.length;\n const bvhNodeCount =\n accelerationBuildMode === \"gpu\"\n ? estimateBinaryBvhNodeCapacity(triangleCount)\n : meshAcceleration.nodes.length;\n const sceneObjects = Object.freeze(\n normalizeSceneObjects(options.sceneObjects, meshes.length === 0)\n );\n const mediums = collectWavefrontMediums(options, meshes, sceneObjects);\n const sceneObjectCapacity = Math.max(\n sceneObjects.length,\n readPositiveInteger(\"sceneObjectCapacity\", options.sceneObjectCapacity, DEFAULT_SCENE_OBJECT_CAPACITY)\n );\n const triangleCapacity = Math.max(\n triangleCount,\n readNonNegativeInteger(\"triangleCapacity\", options.triangleCapacity, triangleCount)\n );\n const bvhNodeCapacity = Math.max(\n accelerationBuildMode === \"gpu\" ? estimateBinaryBvhNodeCapacity(triangleCount) : bvhNodeCount,\n readNonNegativeInteger(\n \"bvhNodeCapacity\",\n options.bvhNodeCapacity,\n accelerationBuildMode === \"gpu\" ? estimateBinaryBvhNodeCapacity(triangleCount) : bvhNodeCount\n )\n );\n const bvhLeafSortCapacity =\n accelerationBuildMode === \"gpu\" ? estimateBvhLeafSortCapacity(triangleCount) : 0;\n const bvhSortStages =\n accelerationBuildMode === \"gpu\"\n ? createWavefrontBvhSortStages(triangleCount)\n : Object.freeze([]);\n const bvhBuildLevels =\n accelerationBuildMode === \"gpu\"\n ? createWavefrontBvhBuildLevels(triangleCount)\n : Object.freeze([]);\n const camera = resolveCamera(options.camera, width, height);\n const environmentColor = Object.freeze(asColor(options.environmentColor, DEFAULT_ENVIRONMENT_COLOR));\n const ambientColor = Object.freeze(asColor(options.ambientColor, DEFAULT_AMBIENT_COLOR));\n const environmentLighting = resolveEnvironmentLighting(\n options.environmentLighting,\n environmentColor,\n ambientColor\n );\n const environmentPortals = normalizeEnvironmentPortals(\n options.environmentPortals ??\n options.environmentLightPortals ??\n options.environmentLighting?.environmentPortals\n );\n const environmentPortalCapacity = Math.max(\n environmentPortals.length,\n readNonNegativeInteger(\n \"environmentPortalCapacity\",\n options.environmentPortalCapacity,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY\n )\n );\n const environmentPortalMode = resolveEnvironmentPortalMode(\n options.environmentPortalMode ??\n options.portalMode ??\n options.environmentLighting?.environmentPortalMode,\n environmentPortals.length > 0\n );\n const environmentMap = resolveEnvironmentMap(\n options.environmentMap ??\n options.environmentTexture ??\n options.environmentLighting?.environmentMap\n );\n const deferredPathResolve = resolveDeferredPathResolve(options);\n const strictPhysicalLowSppLighting = resolveStrictPhysicalLowSppLighting(options);\n const transportExperiments = resolveTransportExperiments(options, strictPhysicalLowSppLighting);\n\n return Object.freeze({\n mode: rendererWavefrontComputeMode,\n width,\n height,\n maxDepth,\n tileSize,\n samplesPerPixel,\n maxFramePassesPerSubmission,\n tilePixelCapacity,\n sceneObjects,\n sceneObjectCount: sceneObjects.length,\n sceneObjectCapacity,\n mediums,\n mediumCount: mediums.length,\n accelerationBuildMode,\n gpuAccelerationBuildRequired: accelerationBuildMode === \"gpu\" && triangleCount > 0,\n gpuMeshSource,\n gpuMaterialSource,\n meshAcceleration,\n emissiveTriangleIndices,\n emissiveTriangleCount: emissiveTriangleIndices.count,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n triangleCount,\n triangleCapacity,\n bvhNodeCount,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n bvhSortStages,\n bvhBuildLevels,\n camera,\n environmentColor: environmentLighting.environmentColor,\n ambientColor: environmentLighting.ambientColor,\n environmentLighting,\n environmentPortals,\n environmentPortalCount: environmentPortals.length,\n environmentPortalCapacity,\n environmentPortalMode,\n environmentMap,\n deferredPathResolve,\n strictPhysicalLowSppLighting,\n transportExperiments,\n transportExperimentFlags: transportExperiments.bitmask,\n presentationOutput: resolveWavefrontPresentationOutput(options.presentationOutput),\n displayQuality: options.displayQuality === true,\n requiresMeshBvhForDisplayQuality: true,\n denoise: options.denoise !== false,\n frameIndex: readNonNegativeInteger(\"frameIndex\", options.frameIndex, 0),\n memory: estimateWavefrontPathTracingMemory({\n width,\n height,\n tileSize,\n samplesPerPixel,\n tilePixelCapacity,\n maxDepth,\n sceneObjectCapacity,\n triangleCapacity,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n environmentPortalCapacity,\n meshVertexCount: gpuMeshSource.vertices.count,\n meshIndexCount: gpuMeshSource.indices.count,\n meshRangeCount: gpuMeshSource.meshes.count,\n bvhSortStageCount: bvhSortStages.length,\n bvhBuildLevelCount: bvhBuildLevels.length,\n denoise: options.denoise !== false,\n deferredPathResolve,\n }),\n });\n}\n\nexport function supportsWavefrontPathTracingCompute(options = {}) {\n const navigatorRef = options.navigator ?? globalThis.navigator;\n return typeof navigatorRef?.gpu?.requestAdapter === \"function\";\n}\n","import {\n add,\n cross,\n dot,\n normalize,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\n\nexport function reflectVector(direction, normal) {\n return subtract(direction, scale(normal, 2 * dot(direction, normal)));\n}\n\nexport function buildOrthonormalBasis(normal) {\n const tangentFallback = Math.abs(normal[1]) < 0.999 ? [0, 1, 0] : [1, 0, 0];\n const tangent = normalize(cross(tangentFallback, normal), [1, 0, 0]);\n const bitangent = normalize(cross(normal, tangent), [0, 0, 1]);\n return { tangent, bitangent };\n}\n\nexport function localToWorld(local, normal) {\n const basis = buildOrthonormalBasis(normal);\n return normalize(\n add(\n add(scale(basis.tangent, local[0]), scale(basis.bitangent, local[1])),\n scale(normal, local[2])\n ),\n normal\n );\n}\n\nexport function radicalInverseVdc(bits) {\n let value = bits >>> 0;\n value = ((value << 16) | (value >>> 16)) >>> 0;\n value = (((value & 0x55555555) << 1) | ((value & 0xaaaaaaaa) >>> 1)) >>> 0;\n value = (((value & 0x33333333) << 2) | ((value & 0xcccccccc) >>> 2)) >>> 0;\n value = (((value & 0x0f0f0f0f) << 4) | ((value & 0xf0f0f0f0) >>> 4)) >>> 0;\n value = (((value & 0x00ff00ff) << 8) | ((value & 0xff00ff00) >>> 8)) >>> 0;\n return value * 2.3283064365386963e-10;\n}\n\nexport function hammersley(index, count) {\n return [index / Math.max(count, 1), radicalInverseVdc(index)];\n}\n\nexport function importanceSampleGgx(sample, roughness, normal) {\n const alpha = Math.max(roughness * roughness, 0.0001);\n const phi = 2 * Math.PI * sample[0];\n const cosTheta = Math.sqrt((1 - sample[1]) / (1 + (alpha * alpha - 1) * sample[1]));\n const sinTheta = Math.sqrt(Math.max(0, 1 - cosTheta * cosTheta));\n const halfVector = localToWorld(\n [Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta],\n normal\n );\n return normalize(halfVector, normal);\n}\n\nexport function distributionGgx(nDotH, roughness) {\n const alpha = Math.max(roughness * roughness, 0.0001);\n const alpha2 = alpha * alpha;\n const denom = (nDotH * nDotH) * (alpha2 - 1) + 1;\n return alpha2 / Math.max(Math.PI * denom * denom, 0.000001);\n}\n\nexport function geometrySchlickGgx(nDotV, roughness) {\n const k = ((roughness + 1) * (roughness + 1)) / 8;\n return nDotV / Math.max(nDotV * (1 - k) + k, 0.000001);\n}\n\nexport function geometrySmith(nDotV, nDotL, roughness) {\n return geometrySchlickGgx(nDotV, roughness) * geometrySchlickGgx(nDotL, roughness);\n}\n\nexport function integrateBrdfSample(nDotV, roughness, sampleCount) {\n const viewDirection = [Math.sqrt(Math.max(0, 1 - nDotV * nDotV)), 0, nDotV];\n const normal = [0, 0, 1];\n let scaleTerm = 0;\n let biasTerm = 0;\n for (let index = 0; index < sampleCount; index += 1) {\n const xi = hammersley(index, sampleCount);\n const halfVector = importanceSampleGgx(xi, roughness, normal);\n const vDotH = Math.max(dot(viewDirection, halfVector), 0);\n const lightDirection = normalize(\n subtract(scale(halfVector, 2 * vDotH), viewDirection),\n normal\n );\n const nDotL = Math.max(lightDirection[2], 0);\n const nDotH = Math.max(halfVector[2], 0);\n if (nDotL <= 0 || nDotH <= 0 || vDotH <= 0) {\n continue;\n }\n const geometry = geometrySmith(nDotV, nDotL, roughness);\n const visibility = (geometry * vDotH) / Math.max(nDotH * nDotV, 0.000001);\n const fresnel = (1 - vDotH) ** 5;\n scaleTerm += (1 - fresnel) * visibility;\n biasTerm += fresnel * visibility;\n }\n return [scaleTerm / sampleCount, biasTerm / sampleCount];\n}\n","import {\n BRDF_LUT_UPLOAD_CACHE,\n DEFAULT_BRDF_LUT_SAMPLE_COUNT,\n DEFAULT_BRDF_LUT_SIZE,\n HIT_RECORD_BYTES,\n MEDIUM_TABLE_ROWS,\n PATH_VERTEX_RECORD_BYTES,\n RAY_RECORD_BYTES,\n} from \"./wavefront-core.js\";\nimport {\n add,\n clamp,\n dot,\n normalize,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n hammersley,\n importanceSampleGgx,\n integrateBrdfSample,\n} from \"./wavefront-sampling.js\";\n\nexport function clampTileSizeForDevice(config, device) {\n const limit = Number(device?.limits?.maxStorageBufferBindingSize);\n if (!Number.isFinite(limit) || limit <= 0) {\n return config.tileSize;\n }\n\n const maxPixelsByRay = Math.floor(limit / RAY_RECORD_BYTES);\n const maxPixelsByHit = Math.floor(limit / HIT_RECORD_BYTES);\n const maxPixelsByPathVertex = Math.floor(\n limit / ((config.maxDepth + 1) * PATH_VERTEX_RECORD_BYTES)\n );\n const maxPixels = Math.max(\n 256,\n Math.min(maxPixelsByRay, maxPixelsByHit, maxPixelsByPathVertex)\n );\n if (config.tilePixelCapacity <= maxPixels) {\n return config.tileSize;\n }\n\n return Math.max(16, Math.floor(Math.sqrt(maxPixels)));\n}\n\nexport function createBuffer(device, usage, size, label) {\n return device.createBuffer({\n label,\n size: Math.max(4, size),\n usage,\n });\n}\n\nexport function alignTo(value, alignment) {\n const resolvedAlignment = Math.max(1, alignment);\n return Math.ceil(value / resolvedAlignment) * resolvedAlignment;\n}\n\nfunction float32ToFloat16Bits(value) {\n const floatView = new Float32Array(1);\n const intView = new Uint32Array(floatView.buffer);\n floatView[0] = Number.isFinite(value) ? value : 0;\n const x = intView[0];\n const sign = (x >> 16) & 0x8000;\n let mantissa = x & 0x7fffff;\n let exponent = (x >> 23) & 0xff;\n\n if (exponent === 0xff) {\n return sign | (mantissa ? 0x7e00 : 0x7c00);\n }\n\n exponent = exponent - 127 + 15;\n if (exponent >= 0x1f) {\n return sign | 0x7c00;\n }\n if (exponent <= 0) {\n if (exponent < -10) {\n return sign;\n }\n mantissa = (mantissa | 0x800000) >> (1 - exponent);\n return sign | ((mantissa + 0x1000) >> 13);\n }\n return sign | (exponent << 10) | ((mantissa + 0x1000) >> 13);\n}\n\nfunction environmentMapIntegerScale(data) {\n if (data instanceof Uint8Array) {\n return 1 / 255;\n }\n if (data instanceof Uint16Array) {\n return 1 / 65535;\n }\n return 1;\n}\n\nfunction environmentMapHasSamplingData(environmentMap) {\n if (!environmentMap || !environmentMap.data) {\n return false;\n }\n const width = Math.max(1, environmentMap.width ?? 1);\n const height = Math.max(1, environmentMap.height ?? 1);\n return environmentMap.data.length >= width * height * 4;\n}\n\nfunction createRgba8TextureUpload(source) {\n const width = Math.max(1, Math.trunc(source.width));\n const height = Math.max(1, Math.trunc(source.height));\n const bytesPerRow = alignTo(width * 4, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const data = source.data instanceof Uint8Array ? source.data : new Uint8Array(source.data);\n for (let y = 0; y < height; y += 1) {\n const sourceOffset = y * width * 4;\n const targetOffset = y * bytesPerRow;\n bytes.set(data.subarray(sourceOffset, sourceOffset + width * 4), targetOffset);\n }\n return Object.freeze({\n bytes,\n bytesPerRow,\n width,\n height,\n });\n}\n\nfunction readEnvironmentMapComponent(data, index, fallback, integerScale = 1) {\n if (!data || index >= data.length) {\n return fallback;\n }\n const value = Number(data[index]);\n return Number.isFinite(value) ? Math.max(0, value) * integerScale : fallback;\n}\n\nfunction createBrdfLutUploadBytes(\n size = DEFAULT_BRDF_LUT_SIZE,\n sampleCount = DEFAULT_BRDF_LUT_SAMPLE_COUNT\n) {\n const cacheKey = `${Math.max(1, Math.trunc(size))}:${Math.max(1, Math.trunc(sampleCount))}`;\n const cached = BRDF_LUT_UPLOAD_CACHE.get(cacheKey);\n if (cached) {\n return cached;\n }\n const width = Math.max(1, Math.trunc(size));\n const height = Math.max(1, Math.trunc(size));\n const rowBytes = width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < height; y += 1) {\n const roughness = (y + 0.5) / height;\n for (let x = 0; x < width; x += 1) {\n const nDotV = Math.max((x + 0.5) / width, 0.0001);\n const [scaleTerm, biasTerm] = integrateBrdfSample(nDotV, roughness, sampleCount);\n const offset = y * bytesPerRow + x * 8;\n view.setUint16(offset, float32ToFloat16Bits(scaleTerm), true);\n view.setUint16(offset + 2, float32ToFloat16Bits(biasTerm), true);\n view.setUint16(offset + 4, float32ToFloat16Bits(0), true);\n view.setUint16(offset + 6, float32ToFloat16Bits(1), true);\n }\n }\n const upload = Object.freeze({ bytes, bytesPerRow, width, height });\n BRDF_LUT_UPLOAD_CACHE.set(cacheKey, upload);\n return upload;\n}\n\nfunction createLinearEnvironmentPixels(environmentMap, fallbackColor) {\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const pixels = new Float32Array(width * height * 4);\n const data = environmentMap.data;\n const integerScale = environmentMapIntegerScale(data);\n for (let index = 0; index < width * height; index += 1) {\n const sourceOffset = index * 4;\n const targetOffset = index * 4;\n pixels[targetOffset] = readEnvironmentMapComponent(data, sourceOffset, fallbackColor[0], integerScale);\n pixels[targetOffset + 1] = readEnvironmentMapComponent(data, sourceOffset + 1, fallbackColor[1], integerScale);\n pixels[targetOffset + 2] = readEnvironmentMapComponent(data, sourceOffset + 2, fallbackColor[2], integerScale);\n pixels[targetOffset + 3] = readEnvironmentMapComponent(data, sourceOffset + 3, fallbackColor[3] ?? 1, integerScale);\n }\n return pixels;\n}\n\nfunction environmentUvToDirection(u, v, rotationRadians = 0) {\n const angle = (u - rotationRadians / (2 * Math.PI) - 0.5) * 2 * Math.PI;\n const theta = v * Math.PI;\n const sinTheta = Math.sin(theta);\n return [\n Math.cos(angle) * sinTheta,\n Math.cos(theta),\n Math.sin(angle) * sinTheta,\n ];\n}\n\nfunction sampleEnvironmentPixelsBilinear(pixels, width, height, u, v) {\n const wrappedU = ((u % 1) + 1) % 1;\n const clampedV = clamp(v, 0, 1);\n const x = wrappedU * width - 0.5;\n const y = clampedV * height - 0.5;\n const x0 = ((Math.floor(x) % width) + width) % width;\n const y0 = clamp(Math.floor(y), 0, height - 1);\n const x1 = (x0 + 1) % width;\n const y1 = clamp(y0 + 1, 0, height - 1);\n const tx = x - Math.floor(x);\n const ty = y - Math.floor(y);\n const read = (px, py) => {\n const offset = (py * width + px) * 4;\n return [pixels[offset], pixels[offset + 1], pixels[offset + 2], pixels[offset + 3]];\n };\n const a = read(x0, y0);\n const b = read(x1, y0);\n const c = read(x0, y1);\n const d = read(x1, y1);\n const mixPair = (first, second, factor) => first * (1 - factor) + second * factor;\n return [\n mixPair(mixPair(a[0], b[0], tx), mixPair(c[0], d[0], tx), ty),\n mixPair(mixPair(a[1], b[1], tx), mixPair(c[1], d[1], tx), ty),\n mixPair(mixPair(a[2], b[2], tx), mixPair(c[2], d[2], tx), ty),\n mixPair(mixPair(a[3], b[3], tx), mixPair(c[3], d[3], tx), ty),\n ];\n}\n\nfunction directionToEnvironmentUv(direction, rotationRadians = 0) {\n const unitDirection = normalize(direction, [0, 1, 0]);\n const rotationTurns = rotationRadians / (2 * Math.PI);\n const u = ((((Math.atan2(unitDirection[2], unitDirection[0]) / (2 * Math.PI)) + 0.5 + rotationTurns) % 1) + 1) % 1;\n const v = Math.acos(clamp(unitDirection[1], -1, 1)) / Math.PI;\n return [u, clamp(v, 0, 1)];\n}\n\nfunction sampleEnvironmentRadiance(pixels, width, height, direction, rotationRadians = 0) {\n const [u, v] = directionToEnvironmentUv(direction, rotationRadians);\n return sampleEnvironmentPixelsBilinear(pixels, width, height, u, v);\n}\n\nfunction createFloat16RgbaUploadFromLevels(levels) {\n return levels.map((level) => {\n const rowBytes = level.width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * level.height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < level.height; y += 1) {\n for (let x = 0; x < level.width; x += 1) {\n const sourceOffset = (y * level.width + x) * 4;\n const targetOffset = y * bytesPerRow + x * 8;\n view.setUint16(targetOffset, float32ToFloat16Bits(level.data[sourceOffset]), true);\n view.setUint16(targetOffset + 2, float32ToFloat16Bits(level.data[sourceOffset + 1]), true);\n view.setUint16(targetOffset + 4, float32ToFloat16Bits(level.data[sourceOffset + 2]), true);\n view.setUint16(targetOffset + 6, float32ToFloat16Bits(level.data[sourceOffset + 3]), true);\n }\n }\n return Object.freeze({ bytes, bytesPerRow, width: level.width, height: level.height });\n });\n}\n\nfunction createPrefilteredEnvironmentLevels(environmentMap, fallbackColor) {\n const sourcePixels = createLinearEnvironmentPixels(environmentMap, fallbackColor);\n const sourceWidth = Math.max(1, environmentMap.width);\n const sourceHeight = Math.max(1, environmentMap.height);\n const mipLevelCount = Math.max(1, Math.floor(Math.log2(Math.max(sourceWidth, sourceHeight))) + 1);\n const levels = [\n Object.freeze({\n width: sourceWidth,\n height: sourceHeight,\n data: sourcePixels,\n }),\n ];\n for (let mipLevel = 1; mipLevel < mipLevelCount; mipLevel += 1) {\n const width = Math.max(1, sourceWidth >> mipLevel);\n const height = Math.max(1, sourceHeight >> mipLevel);\n const roughness = mipLevelCount <= 1 ? 0 : mipLevel / (mipLevelCount - 1);\n const data = new Float32Array(width * height * 4);\n const sampleCount = roughness < 0.25 ? 64 : roughness < 0.6 ? 96 : 128;\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const direction = environmentUvToDirection((x + 0.5) / width, (y + 0.5) / height, environmentMap.rotationRadians);\n const normal = normalize(direction, [0, 1, 0]);\n const viewDirection = normal;\n let totalWeight = 0;\n const accum = [0, 0, 0];\n for (let sampleIndex = 0; sampleIndex < sampleCount; sampleIndex += 1) {\n const xi = hammersley(sampleIndex, sampleCount);\n const halfVector = importanceSampleGgx(xi, roughness, normal);\n const viewDotHalf = Math.max(dot(viewDirection, halfVector), 0);\n const lightDirection = normalize(\n subtract(scale(halfVector, 2 * viewDotHalf), viewDirection),\n normal\n );\n const nDotL = Math.max(dot(normal, lightDirection), 0);\n if (nDotL <= 0.000001) {\n continue;\n }\n const radiance = sampleEnvironmentRadiance(\n sourcePixels,\n sourceWidth,\n sourceHeight,\n lightDirection,\n environmentMap.rotationRadians\n );\n accum[0] += radiance[0] * nDotL;\n accum[1] += radiance[1] * nDotL;\n accum[2] += radiance[2] * nDotL;\n totalWeight += nDotL;\n }\n const offset = (y * width + x) * 4;\n data[offset] = accum[0] / Math.max(totalWeight, 0.000001);\n data[offset + 1] = accum[1] / Math.max(totalWeight, 0.000001);\n data[offset + 2] = accum[2] / Math.max(totalWeight, 0.000001);\n data[offset + 3] = 1;\n }\n }\n levels.push(Object.freeze({ width, height, data }));\n }\n return Object.freeze({\n levels,\n mipLevelCount,\n width: sourceWidth,\n height: sourceHeight,\n });\n}\n\nfunction createEnvironmentSamplingTables(environmentMap, fallbackColor) {\n if (!environmentMapHasSamplingData(environmentMap)) {\n return Object.freeze({\n width: 1,\n height: 1,\n pdf: new Float32Array([1]),\n marginalCdf: new Float32Array([1]),\n conditionalCdf: new Float32Array([1]),\n hasImportanceData: false,\n });\n }\n const pixels = createLinearEnvironmentPixels(environmentMap, fallbackColor);\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const pdf = new Float32Array(width * height);\n const marginalCdf = new Float32Array(height);\n const conditionalCdf = new Float32Array(width * height);\n const rowSums = new Float32Array(height);\n let totalWeight = 0;\n for (let y = 0; y < height; y += 1) {\n const theta = ((y + 0.5) / height) * Math.PI;\n const sinTheta = Math.max(Math.sin(theta), 0.0001);\n let rowWeight = 0;\n for (let x = 0; x < width; x += 1) {\n const offset = (y * width + x) * 4;\n const luminance = pixels[offset] * 0.2126 + pixels[offset + 1] * 0.7152 + pixels[offset + 2] * 0.0722;\n const weight = Math.max(luminance * sinTheta, 0.000001);\n pdf[y * width + x] = weight;\n rowWeight += weight;\n conditionalCdf[y * width + x] = rowWeight;\n }\n rowSums[y] = rowWeight;\n totalWeight += rowWeight;\n if (rowWeight > 0) {\n for (let x = 0; x < width; x += 1) {\n conditionalCdf[y * width + x] /= rowWeight;\n }\n } else {\n for (let x = 0; x < width; x += 1) {\n conditionalCdf[y * width + x] = (x + 1) / width;\n }\n }\n marginalCdf[y] = totalWeight;\n }\n for (let y = 0; y < height; y += 1) {\n marginalCdf[y] /= Math.max(totalWeight, 0.000001);\n }\n for (let index = 0; index < pdf.length; index += 1) {\n pdf[index] /= Math.max(totalWeight, 0.000001);\n }\n return Object.freeze({\n width,\n height,\n pdf,\n marginalCdf,\n conditionalCdf,\n hasImportanceData: true,\n });\n}\n\nfunction createEnvironmentMapUploadBytes(environmentMap, fallbackColor) {\n const width = Math.max(1, environmentMap.width);\n const height = Math.max(1, environmentMap.height);\n const rowBytes = width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * height);\n const data = environmentMap.data;\n const integerScale = environmentMapIntegerScale(data);\n const view = new DataView(bytes.buffer);\n const writeComponent = (targetOffset, sourceOffset, fallback) => {\n view.setUint16(\n targetOffset,\n float32ToFloat16Bits(\n readEnvironmentMapComponent(data, sourceOffset, fallback, integerScale)\n ),\n true\n );\n };\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const sourceOffset = (y * width + x) * 4;\n const targetOffset = y * bytesPerRow + x * 8;\n writeComponent(targetOffset, sourceOffset, fallbackColor[0]);\n writeComponent(targetOffset + 2, sourceOffset + 1, fallbackColor[1]);\n writeComponent(targetOffset + 4, sourceOffset + 2, fallbackColor[2]);\n writeComponent(targetOffset + 6, sourceOffset + 3, fallbackColor[3] ?? 1);\n }\n }\n\n const upload = Object.freeze({\n bytes,\n bytesPerRow,\n width,\n height,\n });\n return upload;\n}\n\nexport function createEnvironmentMapResource(device, constants, environmentMap, fallbackColor) {\n if (environmentMap.view) {\n return Object.freeze({\n view: environmentMap.view,\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture: null,\n ownsTexture: false,\n width: Math.max(1, environmentMap.width),\n height: Math.max(1, environmentMap.height),\n mipLevelCount: Math.max(1, environmentMap.mipLevelCount ?? 1),\n });\n }\n\n if (environmentMap.texture && typeof environmentMap.texture.createView === \"function\") {\n return Object.freeze({\n view: environmentMap.texture.createView(),\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture: environmentMap.texture,\n ownsTexture: false,\n width: Math.max(1, environmentMap.width),\n height: Math.max(1, environmentMap.height),\n mipLevelCount: Math.max(1, environmentMap.mipLevelCount ?? 1),\n });\n }\n\n const prefiltered = createPrefilteredEnvironmentLevels(environmentMap, fallbackColor);\n const uploads = createFloat16RgbaUploadFromLevels(prefiltered.levels);\n const texture = device.createTexture({\n label: environmentMap.enabled\n ? \"plasius.wavefront.environmentMap\"\n : \"plasius.wavefront.environmentMapFallback\",\n size: { width: prefiltered.width, height: prefiltered.height },\n format: \"rgba16float\",\n mipLevelCount: prefiltered.mipLevelCount,\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n uploads.forEach((upload, mipLevel) => {\n device.queue.writeTexture(\n { texture, mipLevel },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n });\n return Object.freeze({\n view: texture.createView(),\n sampler: environmentMap.sampler ?? device.createSampler({\n label: \"plasius.wavefront.environmentMapSampler\",\n addressModeU: \"repeat\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n }),\n texture,\n ownsTexture: true,\n width: prefiltered.width,\n height: prefiltered.height,\n mipLevelCount: prefiltered.mipLevelCount,\n });\n}\n\nexport function createEnvironmentSamplingTextureResource(device, constants, environmentMap, fallbackColor) {\n const tables = createEnvironmentSamplingTables(environmentMap, fallbackColor);\n const rowBytes = tables.width * 8;\n const bytesPerRow = alignTo(rowBytes, 256);\n const bytes = new Uint8Array(bytesPerRow * tables.height);\n const view = new DataView(bytes.buffer);\n for (let y = 0; y < tables.height; y += 1) {\n for (let x = 0; x < tables.width; x += 1) {\n const probability = tables.pdf[y * tables.width + x];\n const conditional = tables.conditionalCdf[y * tables.width + x];\n const marginal = tables.marginalCdf[y];\n const offset = y * bytesPerRow + x * 8;\n view.setUint16(offset, float32ToFloat16Bits(probability), true);\n view.setUint16(offset + 2, float32ToFloat16Bits(conditional), true);\n view.setUint16(offset + 4, float32ToFloat16Bits(marginal), true);\n view.setUint16(offset + 6, float32ToFloat16Bits(1), true);\n }\n }\n const texture = device.createTexture({\n label: \"plasius.wavefront.environmentSampling\",\n size: { width: tables.width, height: tables.height },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n bytes,\n { bytesPerRow, rowsPerImage: tables.height },\n { width: tables.width, height: tables.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n view: texture.createView(),\n texture,\n ownsTexture: true,\n hasImportanceData: tables.hasImportanceData,\n });\n}\n\nexport function createBrdfLutResource(device, constants, size = DEFAULT_BRDF_LUT_SIZE) {\n const upload = createBrdfLutUploadBytes(size);\n const texture = device.createTexture({\n label: \"plasius.wavefront.brdfLut\",\n size: { width: upload.width, height: upload.height },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n view: texture.createView(),\n sampler: device.createSampler({\n label: \"plasius.wavefront.brdfLutSampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n }),\n texture,\n ownsTexture: true,\n width: upload.width,\n height: upload.height,\n });\n}\n\nexport function createMediumTextureResource(device, constants, mediums) {\n const normalized = Array.isArray(mediums) && mediums.length > 0 ? mediums : [{ id: 0 }];\n const width = Math.max(\n 1,\n normalized.reduce((maximum, medium) => Math.max(maximum, medium.id ?? 0), 0) + 1\n );\n const level = {\n width,\n height: MEDIUM_TABLE_ROWS,\n data: new Float32Array(width * MEDIUM_TABLE_ROWS * 4),\n };\n\n for (const medium of normalized) {\n const mediumId = Math.max(0, Math.trunc(Number(medium.id) || 0));\n const absorptionOffset = mediumId * 4;\n level.data[absorptionOffset] = Math.max(0, medium.absorption?.[0] ?? 0);\n level.data[absorptionOffset + 1] = Math.max(0, medium.absorption?.[1] ?? 0);\n level.data[absorptionOffset + 2] = Math.max(0, medium.absorption?.[2] ?? 0);\n level.data[absorptionOffset + 3] = Math.max(0, medium.phaseModel ?? 0);\n\n const scatteringOffset = (width + mediumId) * 4;\n level.data[scatteringOffset] = Math.max(0, medium.scattering?.[0] ?? 0);\n level.data[scatteringOffset + 1] = Math.max(0, medium.scattering?.[1] ?? 0);\n level.data[scatteringOffset + 2] = Math.max(0, medium.scattering?.[2] ?? 0);\n level.data[scatteringOffset + 3] = Math.max(0, medium.density ?? 0);\n }\n\n const upload = createFloat16RgbaUploadFromLevels([level])[0];\n const texture = device.createTexture({\n label: \"plasius.wavefront.mediumTable\",\n size: { width, height: MEDIUM_TABLE_ROWS },\n format: \"rgba16float\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width, height: MEDIUM_TABLE_ROWS, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n texture,\n view: texture.createView(),\n ownsTexture: true,\n count: normalized.length,\n width,\n });\n}\n\nexport function mediumTablesEqual(left, right) {\n const leftMediums = Array.isArray(left) ? left : [];\n const rightMediums = Array.isArray(right) ? right : [];\n if (leftMediums.length !== rightMediums.length) {\n return false;\n }\n for (let index = 0; index < leftMediums.length; index += 1) {\n const leftMedium = leftMediums[index];\n const rightMedium = rightMediums[index];\n if ((leftMedium?.id ?? 0) !== (rightMedium?.id ?? 0)) {\n return false;\n }\n if ((leftMedium?.phaseModel ?? 0) !== (rightMedium?.phaseModel ?? 0)) {\n return false;\n }\n if ((leftMedium?.density ?? 0) !== (rightMedium?.density ?? 0)) {\n return false;\n }\n for (let component = 0; component < 3; component += 1) {\n if ((leftMedium?.absorption?.[component] ?? 0) !== (rightMedium?.absorption?.[component] ?? 0)) {\n return false;\n }\n if ((leftMedium?.scattering?.[component] ?? 0) !== (rightMedium?.scattering?.[component] ?? 0)) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport function createAtlasTextureResource(device, constants, atlas, label) {\n const upload = createRgba8TextureUpload(atlas);\n const texture = device.createTexture({\n label,\n size: { width: upload.width, height: upload.height },\n format: \"rgba8unorm\",\n usage: constants.texture.TEXTURE_BINDING | constants.texture.COPY_DST,\n });\n device.queue.writeTexture(\n { texture },\n upload.bytes,\n { bytesPerRow: upload.bytesPerRow, rowsPerImage: upload.height },\n { width: upload.width, height: upload.height, depthOrArrayLayers: 1 }\n );\n return Object.freeze({\n texture,\n view: texture.createView(),\n ownsTexture: true,\n });\n}\n","import { CONFIG_BUFFER_BYTES } from \"./wavefront-core.js\";\n\nexport function createWavefrontTraceBindGroup({\n device,\n traceBindGroupLayout,\n activeBuffer,\n nextBuffer,\n frameConfigBuffer,\n hitBuffer,\n accumulationBuffer,\n sceneObjectBuffer,\n counterBuffer,\n outputView,\n triangleBuffer,\n bvhNodeBuffer,\n radianceView,\n environmentPortalBuffer,\n environmentMapResource,\n pathVertexBuffer,\n baseColorAtlasResource,\n metallicRoughnessAtlasResource,\n normalAtlasResource,\n occlusionAtlasResource,\n emissiveAtlasResource,\n materialAtlasSampler,\n brdfLutResource,\n environmentSamplingResource,\n mediumTextureResource,\n extensionAtlasResources = {},\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: traceBindGroupLayout,\n entries: [\n { binding: 0, resource: { buffer: activeBuffer } },\n { binding: 1, resource: { buffer: nextBuffer } },\n { binding: 2, resource: { buffer: hitBuffer } },\n { binding: 3, resource: { buffer: accumulationBuffer } },\n { binding: 4, resource: { buffer: sceneObjectBuffer } },\n { binding: 5, resource: { buffer: frameConfigBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 6, resource: { buffer: counterBuffer } },\n { binding: 7, resource: outputView },\n { binding: 8, resource: { buffer: triangleBuffer } },\n { binding: 9, resource: { buffer: bvhNodeBuffer } },\n { binding: 16, resource: radianceView },\n { binding: 19, resource: { buffer: environmentPortalBuffer } },\n { binding: 20, resource: environmentMapResource.view },\n { binding: 21, resource: environmentMapResource.sampler },\n { binding: 22, resource: { buffer: pathVertexBuffer } },\n { binding: 23, resource: baseColorAtlasResource.view },\n { binding: 24, resource: metallicRoughnessAtlasResource.view },\n { binding: 25, resource: normalAtlasResource.view },\n { binding: 26, resource: occlusionAtlasResource.view },\n { binding: 27, resource: emissiveAtlasResource.view },\n { binding: 28, resource: materialAtlasSampler },\n { binding: 29, resource: brdfLutResource.view },\n { binding: 30, resource: brdfLutResource.sampler },\n { binding: 31, resource: environmentSamplingResource.view },\n { binding: 32, resource: mediumTextureResource.view },\n { binding: 33, resource: extensionAtlasResources.clearcoat.view },\n { binding: 34, resource: extensionAtlasResources.clearcoatRoughness.view },\n { binding: 35, resource: extensionAtlasResources.clearcoatNormal.view },\n { binding: 36, resource: extensionAtlasResources.transmission.view },\n { binding: 37, resource: extensionAtlasResources.thickness.view },\n { binding: 38, resource: extensionAtlasResources.sheenColor.view },\n { binding: 39, resource: extensionAtlasResources.sheenRoughness.view },\n { binding: 40, resource: extensionAtlasResources.specular.view },\n { binding: 41, resource: extensionAtlasResources.specularColor.view },\n { binding: 42, resource: extensionAtlasResources.iridescence.view },\n { binding: 43, resource: extensionAtlasResources.iridescenceThickness.view },\n { binding: 44, resource: extensionAtlasResources.anisotropy.view },\n ],\n });\n}\n\nexport function createWavefrontTraceBindGroups(options) {\n return [\n createWavefrontTraceBindGroup({\n ...options,\n activeBuffer: options.activeQueue,\n nextBuffer: options.nextQueue,\n label: \"plasius.wavefront.bind.activeNext\",\n }),\n createWavefrontTraceBindGroup({\n ...options,\n activeBuffer: options.nextQueue,\n nextBuffer: options.activeQueue,\n label: \"plasius.wavefront.bind.nextActive\",\n }),\n ];\n}\n\nexport function createWavefrontBvhBuildBindGroup({\n device,\n accelerationBindGroupLayout,\n bvhBuildConfigBuffer,\n triangleBuffer,\n bvhNodeBuffer,\n meshVertexBuffer,\n meshIndexBuffer,\n meshRangeBuffer,\n bvhLeafRefBuffer,\n}) {\n return device.createBindGroup({\n label: \"plasius.wavefront.bind.bvhBuild\",\n layout: accelerationBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: bvhBuildConfigBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 8, resource: { buffer: triangleBuffer } },\n { binding: 9, resource: { buffer: bvhNodeBuffer } },\n { binding: 10, resource: { buffer: meshVertexBuffer } },\n { binding: 11, resource: { buffer: meshIndexBuffer } },\n { binding: 12, resource: { buffer: meshRangeBuffer } },\n { binding: 13, resource: { buffer: bvhLeafRefBuffer } },\n ],\n });\n}\n\nfunction createWavefrontDenoiseRadianceBindGroup({\n device,\n denoiseRadianceBindGroupLayout,\n configBuffer,\n inputView,\n targetView,\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: denoiseRadianceBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: configBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 14, resource: inputView },\n { binding: 15, resource: targetView },\n ],\n });\n}\n\nfunction createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView,\n targetView,\n label,\n}) {\n return device.createBindGroup({\n label,\n layout: denoiseResolveBindGroupLayout,\n entries: [\n { binding: 5, resource: { buffer: configBuffer, size: CONFIG_BUFFER_BYTES } },\n { binding: 17, resource: inputView },\n { binding: 18, resource: targetView },\n ],\n });\n}\n\nexport function createWavefrontDenoiseBindGroups({\n device,\n denoiseRadianceBindGroupLayout,\n denoiseResolveBindGroupLayout,\n configBuffer,\n radianceView,\n denoiseScratchView,\n outputView,\n}) {\n return Object.freeze({\n radiance: createWavefrontDenoiseRadianceBindGroup({\n device,\n denoiseRadianceBindGroupLayout,\n configBuffer,\n inputView: radianceView,\n targetView: denoiseScratchView,\n label: \"plasius.wavefront.bind.denoise.radianceToScratch\",\n }),\n resolve: createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView: denoiseScratchView,\n targetView: outputView,\n label: \"plasius.wavefront.bind.denoise.scratchToOutput\",\n }),\n directResolve: createWavefrontDenoiseResolveBindGroup({\n device,\n denoiseResolveBindGroupLayout,\n configBuffer,\n inputView: radianceView,\n targetView: outputView,\n label: \"plasius.wavefront.bind.denoise.radianceToOutput\",\n }),\n });\n}\n\nexport function createWavefrontPresentBindGroup({\n device,\n presentBindGroupLayout,\n outputView,\n sampler,\n}) {\n return device.createBindGroup({\n label: \"plasius.wavefront.presentBindGroup\",\n layout: presentBindGroupLayout,\n entries: [\n { binding: 0, resource: outputView },\n { binding: 1, resource: sampler },\n ],\n });\n}\n","import {\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n GPU_READBACK_COMPLETION_TIMEOUT_MS,\n GPU_SUBMITTED_WORK_TIMEOUT_MS,\n TRACE_SAMPLED_TEXTURE_BINDINGS,\n TRACE_STORAGE_BUFFER_BINDINGS,\n WORKGROUP_SIZE,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\n\nconst WEBGPU_DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE = 128 * 1024 * 1024;\nconst WEBGPU_DEFAULT_MAX_BUFFER_SIZE = 256 * 1024 * 1024;\n\nfunction readRequestedDeviceLimit(source, name) {\n const rawValue = source?.[name];\n if (rawValue === undefined || rawValue === null) {\n return 0;\n }\n const value = Number(rawValue);\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative safe integer.`);\n }\n return value;\n}\n\nfunction assertAdapterSupportsRequiredLimit(adapter, name, requiredValue) {\n const availableValue = Number(adapter?.limits?.[name]);\n if (!Number.isFinite(availableValue)) {\n throw new Error(\n `Wavefront scene buffers require ${name}>=${requiredValue} bytes, ` +\n \"but this adapter does not expose that limit.\"\n );\n }\n if (availableValue < requiredValue) {\n throw new Error(\n `Wavefront scene buffers require ${name}>=${requiredValue} bytes, ` +\n `but this adapter exposes ${availableValue} bytes.`\n );\n }\n}\n\nexport function getGpuUsageConstants() {\n if (\n typeof GPUBufferUsage === \"undefined\" ||\n typeof GPUTextureUsage === \"undefined\" ||\n typeof GPUShaderStage === \"undefined\"\n ) {\n throw new Error(\"WebGPU runtime unavailable. Required GPU constants are missing.\");\n }\n if (typeof GPUBufferUsage.INDIRECT !== \"number\") {\n throw new Error(\"WebGPU runtime unavailable. GPUBufferUsage.INDIRECT is missing.\");\n }\n\n return {\n buffer: GPUBufferUsage,\n texture: GPUTextureUsage,\n shader: GPUShaderStage,\n map: typeof GPUMapMode === \"undefined\" ? null : GPUMapMode,\n };\n}\n\nexport function resolveCanvas(canvasOrSelector, documentRef = globalThis.document) {\n if (typeof canvasOrSelector === \"string\") {\n const resolved = documentRef?.querySelector?.(canvasOrSelector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector: ${canvasOrSelector}`);\n }\n return resolved;\n }\n\n if (canvasOrSelector?.getContext) {\n return canvasOrSelector;\n }\n\n const fallback = documentRef?.querySelector?.(\"canvas[data-plasius-wavefront-path-tracing]\");\n if (!fallback) {\n throw new Error(\"A canvas is required for WebGPU wavefront path tracing.\");\n }\n return fallback;\n}\n\nasync function getPipelineDiagnostics(shaderModule) {\n if (typeof shaderModule?.getCompilationInfo !== \"function\") {\n return \"\";\n }\n try {\n const info = await shaderModule.getCompilationInfo();\n const messages = info.messages ?? [];\n if (messages.length === 0) {\n return \"\";\n }\n return messages\n .map((message) => {\n const line = message.lineNum ?? \"?\";\n const column = message.linePos ?? \"?\";\n return `line ${line}:${column} ${message.message}`;\n })\n .join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\nexport async function createComputePipeline(device, shaderModule, layout, entryPoint, label) {\n const descriptor = {\n label,\n layout,\n compute: {\n module: shaderModule,\n entryPoint,\n },\n };\n\n try {\n if (typeof device.createComputePipelineAsync === \"function\") {\n return await device.createComputePipelineAsync(descriptor);\n }\n return device.createComputePipeline(descriptor);\n } catch (error) {\n const diagnostics = await getPipelineDiagnostics(shaderModule);\n const suffix = diagnostics ? `\\n${diagnostics}` : \"\";\n throw new Error(`WGSL compilation failed for ${label}: ${error.message}${suffix}`, {\n cause: error,\n });\n }\n}\n\nexport async function assertShaderModuleCompiles(shaderModule, label) {\n if (typeof shaderModule?.getCompilationInfo !== \"function\") {\n return;\n }\n const info = await shaderModule.getCompilationInfo();\n const messages = Array.isArray(info?.messages) ? info.messages : [];\n const errors = messages.filter((message) => message?.type === \"error\");\n if (errors.length <= 0) {\n return;\n }\n const diagnostics = errors\n .map((message) => {\n const line = Number.isFinite(message.lineNum) ? message.lineNum : \"?\";\n const column = Number.isFinite(message.linePos) ? message.linePos : \"?\";\n return `line ${line}:${column} ${message.message}`;\n })\n .join(\"\\n\");\n throw new Error(`WGSL compilation preflight failed for ${label}:\\n${diagnostics}`);\n}\n\nexport async function createRenderPipeline(device, descriptor) {\n if (typeof device.createRenderPipelineAsync === \"function\") {\n return device.createRenderPipelineAsync(descriptor);\n }\n return device.createRenderPipeline(descriptor);\n}\n\nexport function createWavefrontDeviceDescriptor(adapter, options = {}, memory = null) {\n const descriptor = { ...(options.deviceDescriptor ?? {}) };\n const descriptorRequiredLimits = { ...(descriptor.requiredLimits ?? {}) };\n const requiredLimits = {\n ...descriptorRequiredLimits,\n ...(options.requiredLimits ?? {}),\n };\n const exposedStorageBufferLimit = Number(adapter?.limits?.maxStorageBuffersPerShaderStage);\n if (Number.isFinite(exposedStorageBufferLimit)) {\n if (exposedStorageBufferLimit < TRACE_STORAGE_BUFFER_BINDINGS) {\n throw new Error(\n `Wavefront mesh tracing requires maxStorageBuffersPerShaderStage>=${TRACE_STORAGE_BUFFER_BINDINGS}, ` +\n `but this adapter exposes ${exposedStorageBufferLimit}.`\n );\n }\n requiredLimits.maxStorageBuffersPerShaderStage = Math.max(\n Number(requiredLimits.maxStorageBuffersPerShaderStage ?? 0),\n TRACE_STORAGE_BUFFER_BINDINGS\n );\n }\n\n const exposedSampledTextureLimit = Number(adapter?.limits?.maxSampledTexturesPerShaderStage);\n if (Number.isFinite(exposedSampledTextureLimit)) {\n if (exposedSampledTextureLimit < TRACE_SAMPLED_TEXTURE_BINDINGS) {\n throw new Error(\n `Wavefront material tracing requires maxSampledTexturesPerShaderStage>=${TRACE_SAMPLED_TEXTURE_BINDINGS}, ` +\n `but this adapter exposes ${exposedSampledTextureLimit}.`\n );\n }\n requiredLimits.maxSampledTexturesPerShaderStage = Math.max(\n Number(requiredLimits.maxSampledTexturesPerShaderStage ?? 0),\n TRACE_SAMPLED_TEXTURE_BINDINGS\n );\n }\n\n const sceneStorageBufferBindingBytes = Number(\n memory?.sceneStorageBufferBindingBytes ?? 0\n );\n const requestedStorageBufferBindingSize = Math.max(\n readRequestedDeviceLimit(descriptorRequiredLimits, \"maxStorageBufferBindingSize\"),\n readRequestedDeviceLimit(options.requiredLimits, \"maxStorageBufferBindingSize\"),\n sceneStorageBufferBindingBytes > WEBGPU_DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE\n ? sceneStorageBufferBindingBytes\n : 0\n );\n if (requestedStorageBufferBindingSize > 0) {\n assertAdapterSupportsRequiredLimit(\n adapter,\n \"maxStorageBufferBindingSize\",\n requestedStorageBufferBindingSize\n );\n requiredLimits.maxStorageBufferBindingSize = requestedStorageBufferBindingSize;\n }\n\n const requestedMaxBufferSize = Math.max(\n readRequestedDeviceLimit(descriptorRequiredLimits, \"maxBufferSize\"),\n readRequestedDeviceLimit(options.requiredLimits, \"maxBufferSize\"),\n sceneStorageBufferBindingBytes > WEBGPU_DEFAULT_MAX_BUFFER_SIZE\n ? sceneStorageBufferBindingBytes\n : 0,\n requestedStorageBufferBindingSize > WEBGPU_DEFAULT_MAX_BUFFER_SIZE\n ? requestedStorageBufferBindingSize\n : 0\n );\n if (requestedMaxBufferSize > 0) {\n assertAdapterSupportsRequiredLimit(adapter, \"maxBufferSize\", requestedMaxBufferSize);\n requiredLimits.maxBufferSize = requestedMaxBufferSize;\n }\n\n const requiredFeatures = Array.from(descriptor.requiredFeatures ?? []);\n const adapterFeatures = adapter?.features;\n const timestampQuerySupported =\n typeof adapterFeatures?.has === \"function\"\n ? adapterFeatures.has(\"timestamp-query\")\n : adapterFeatures && typeof adapterFeatures[Symbol.iterator] === \"function\"\n ? Array.from(adapterFeatures).includes(\"timestamp-query\")\n : false;\n if (\n options.gpuTimestamps !== false &&\n timestampQuerySupported &&\n !requiredFeatures.includes(\"timestamp-query\")\n ) {\n requiredFeatures.push(\"timestamp-query\");\n }\n if (requiredFeatures.length > 0) {\n descriptor.requiredFeatures = requiredFeatures;\n }\n if (Object.keys(requiredLimits).length > 0) {\n descriptor.requiredLimits = {\n ...(descriptor.requiredLimits ?? {}),\n ...requiredLimits,\n };\n }\n return Object.keys(descriptor).length > 0 ? descriptor : undefined;\n}\n\nfunction readGpuLimit(adapter, device, name) {\n const adapterValue = Number(adapter?.limits?.[name]);\n if (Number.isFinite(adapterValue)) {\n return adapterValue;\n }\n const deviceValue = Number(device?.limits?.[name]);\n return Number.isFinite(deviceValue) ? deviceValue : null;\n}\n\nfunction createAdapterInfoSnapshot(adapter) {\n const info = adapter?.info;\n if (!info || typeof info !== \"object\") {\n return null;\n }\n return Object.freeze({\n vendor: typeof info.vendor === \"string\" ? info.vendor : \"\",\n architecture: typeof info.architecture === \"string\" ? info.architecture : \"\",\n device: typeof info.device === \"string\" ? info.device : \"\",\n description: typeof info.description === \"string\" ? info.description : \"\",\n });\n}\n\nexport function createGpuAdapterParallelismDiagnostics(adapter, device) {\n return Object.freeze({\n physicalCoreCount: null,\n physicalCoreCountAvailable: false,\n physicalCoreCountUnavailableReason: \"WebGPU does not expose physical GPU core counts.\",\n adapterInfo: createAdapterInfoSnapshot(adapter),\n adapterLimits: Object.freeze({\n maxComputeInvocationsPerWorkgroup: readGpuLimit(adapter, device, \"maxComputeInvocationsPerWorkgroup\"),\n maxComputeWorkgroupSizeX: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeX\"),\n maxComputeWorkgroupSizeY: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeY\"),\n maxComputeWorkgroupSizeZ: readGpuLimit(adapter, device, \"maxComputeWorkgroupSizeZ\"),\n maxComputeWorkgroupsPerDimension: readGpuLimit(adapter, device, \"maxComputeWorkgroupsPerDimension\"),\n maxStorageBuffersPerShaderStage: readGpuLimit(adapter, device, \"maxStorageBuffersPerShaderStage\"),\n maxStorageBufferBindingSize: readGpuLimit(adapter, device, \"maxStorageBufferBindingSize\"),\n maxBufferSize: readGpuLimit(adapter, device, \"maxBufferSize\"),\n }),\n configuredWorkgroupSize: WORKGROUP_SIZE,\n });\n}\n\nexport function createEnvironmentMapSnapshot(environmentMap) {\n return Object.freeze({\n enabled: environmentMap.enabled,\n width: environmentMap.width,\n height: environmentMap.height,\n mipLevelCount: environmentMap.mipLevelCount ?? 1,\n projection: environmentMap.projection,\n intensity: environmentMap.intensity,\n rotationRadians: environmentMap.rotationRadians,\n ambientStrength: environmentMap.ambientStrength,\n hasImportanceData: environmentMap.hasImportanceData === true,\n });\n}\n\nexport function nowMs() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction estimateAccelerationBuildWaitFactor(config) {\n if (config?.gpuAccelerationBuildRequired !== true) {\n return 1;\n }\n const bvhSortStageCount = Array.isArray(config?.bvhSortStages) ? config.bvhSortStages.length : 0;\n const bvhBuildLevelCount = Array.isArray(config?.bvhBuildLevels) ? config.bvhBuildLevels.length : 0;\n const accelerationStageCount = 2 + bvhSortStageCount + bvhBuildLevelCount;\n return Math.max(1, 1 + accelerationStageCount / 96);\n}\n\nexport function estimateSubmittedGpuWorkTiming(\n config,\n tileCount,\n overrideTimeoutMs = null,\n options = {}\n) {\n if (Number.isFinite(overrideTimeoutMs)) {\n const overrideMs = Math.max(1, Math.trunc(Number(overrideTimeoutMs)));\n return Object.freeze({\n timeoutMs: overrideMs,\n maxWaitMs: overrideMs,\n });\n }\n const samplesPerPixel = Math.max(\n 1,\n Number(config?.renderedSamplesPerPixel ?? config?.samplesPerPixel ?? 1)\n );\n const maxDepth = Math.max(1, Number(config?.maxDepth ?? 1));\n const deferredResolvePasses = config?.deferredPathResolve ? 1 : 0;\n const denoisePasses = config?.denoise ? (samplesPerPixel < 4 ? 2 : 1) : 0;\n const tiles = Math.max(1, Number(tileCount ?? 1));\n const estimatedPasses =\n tiles * (samplesPerPixel * (maxDepth + 1 + deferredResolvePasses) + denoisePasses + 1);\n const triangleCount = Math.max(0, Number(config?.triangleCount ?? 0));\n const geometryFactor = Math.max(1, triangleCount / 131072);\n const includeAccelerationBuild = options.includeAccelerationBuild === true;\n const accelerationFactor = includeAccelerationBuild\n ? estimateAccelerationBuildWaitFactor(config)\n : 1;\n const estimatedWindowMs = Math.round(\n (GPU_SUBMITTED_WORK_TIMEOUT_MS + estimatedPasses * 5) * geometryFactor * accelerationFactor\n );\n const timeoutMs = Math.min(\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n Math.max(GPU_SUBMITTED_WORK_TIMEOUT_MS, estimatedWindowMs)\n );\n const maxWaitMultiplier = includeAccelerationBuild ? 3 : 2;\n const maxWaitMs = Math.min(\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n Math.max(timeoutMs, estimatedWindowMs * maxWaitMultiplier)\n );\n return Object.freeze({\n timeoutMs,\n maxWaitMs,\n });\n}\n","import { GPU_SUBMITTED_WORK_TIMEOUT_MS } from \"./wavefront-core.js\";\nimport { nowMs } from \"./wavefront-runtime-support.js\";\n\nexport async function waitForSubmittedGpuWork(device, options = {}) {\n if (typeof device.queue.onSubmittedWorkDone !== \"function\") {\n return true;\n }\n const timeoutMs = Math.max(\n 1,\n Number.isFinite(options.timeoutMs)\n ? Number(options.timeoutMs)\n : GPU_SUBMITTED_WORK_TIMEOUT_MS\n );\n const maxWaitMs = Math.max(\n timeoutMs,\n Number.isFinite(options.maxWaitMs) ? Number(options.maxWaitMs) : timeoutMs\n );\n const allowTimeout = options.allowTimeout !== false;\n const completionPromise = device.queue.onSubmittedWorkDone().then(\n () => ({ status: \"done\" }),\n (error) => {\n throw error;\n }\n );\n const lossPromise =\n typeof device.lost?.then === \"function\"\n ? device.lost.then((info) => {\n throw new Error(\n `WebGPU device lost while waiting for submitted work (${info?.reason ?? \"unknown\"}).`\n );\n })\n : null;\n const startedAtMs = nowMs();\n while (true) {\n const elapsedMs = Math.max(0, nowMs() - startedAtMs);\n const remainingMs = Math.max(0, maxWaitMs - elapsedMs);\n if (remainingMs <= 0) {\n if (!allowTimeout) {\n throw new Error(`Timed out after ${Math.round(maxWaitMs)} ms waiting for submitted GPU work.`);\n }\n console.warn(\n `[plasius.wavefront] Submitted GPU work did not report completion within ${Math.round(maxWaitMs)} ms; continuing.`\n );\n return false;\n }\n const waitWindowMs = Math.max(1, Math.min(timeoutMs, remainingMs));\n let timeoutHandle = null;\n let resolveTimeoutPromise = null;\n let timeoutSettled = false;\n const settleTimeoutPromise = (value) => {\n if (timeoutSettled) {\n return;\n }\n timeoutSettled = true;\n resolveTimeoutPromise?.(value);\n };\n const timeoutPromise = new Promise((resolve) => {\n resolveTimeoutPromise = resolve;\n timeoutHandle = setTimeout(\n () => settleTimeoutPromise({ status: \"timeout\" }),\n waitWindowMs\n );\n });\n let result;\n try {\n result = await Promise.race(\n [completionPromise, timeoutPromise, lossPromise].filter(Boolean)\n );\n } finally {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n settleTimeoutPromise({ status: \"cancelled\" });\n }\n }\n if (result?.status === \"done\") {\n return true;\n }\n if (result?.status !== \"timeout\") {\n return true;\n }\n }\n}\n","import { GPU_READBACK_COMPLETION_TIMEOUT_MS } from \"./wavefront-core.js\";\nimport { createBuffer } from \"./wavefront-gpu-resources.js\";\n\nconst TIMESTAMP_QUERY_COUNT = 2;\nconst TIMESTAMP_BUFFER_BYTES = TIMESTAMP_QUERY_COUNT * BigUint64Array.BYTES_PER_ELEMENT;\n\nfunction hasGpuFeature(features, name) {\n if (typeof features?.has === \"function\") {\n return features.has(name);\n }\n if (features && typeof features[Symbol.iterator] === \"function\") {\n return Array.from(features).includes(name);\n }\n return false;\n}\n\nfunction freezeRayCountTelemetry(values = {}) {\n return Object.freeze({\n status: values.status ?? \"not-requested\",\n source: values.source ?? null,\n expectedPrimaryRays: values.expectedPrimaryRays ?? null,\n observedPrimaryRays: values.observedPrimaryRays ?? null,\n secondaryRays: values.secondaryRays ?? null,\n totalPathSegments: values.totalPathSegments ?? null,\n bounceHistogram: Object.freeze([...(values.bounceHistogram ?? [])]),\n capturedRayCounts: values.capturedRayCounts ?? 0,\n expectedRayCounts: values.expectedRayCounts ?? 0,\n reason: values.reason ?? null,\n });\n}\n\nexport function createWavefrontRayCountTelemetry(values = {}) {\n return freezeRayCountTelemetry(values);\n}\n\nexport function createWavefrontFrameTimingTelemetry(values = {}) {\n return Object.freeze({\n status: values.status ?? \"not-requested\",\n source: values.source ?? null,\n timestampQueryStatus: values.timestampQueryStatus ?? \"not-recorded\",\n totalGpuTimeMs: values.totalGpuTimeMs ?? null,\n totalRenderJobTimeMs: Math.max(0, Number(values.totalRenderJobTimeMs ?? 0)),\n classificationTimeMs: values.classificationTimeMs ?? null,\n compactionTimeMs: values.compactionTimeMs ?? null,\n samplingTimeMs: values.samplingTimeMs ?? null,\n reason: values.reason ?? null,\n });\n}\n\nfunction safeErrorReason(error) {\n return error instanceof Error && error.message\n ? error.message\n : \"unknown-telemetry-readback-failure\";\n}\n\nfunction timestampDurationMs(values) {\n if (values.length < TIMESTAMP_QUERY_COUNT || values[1] < values[0]) {\n return null;\n }\n const durationNanoseconds = values[1] - values[0];\n const durationMs = Number(durationNanoseconds) / 1_000_000;\n return Number.isFinite(durationMs) && durationMs >= 0 ? durationMs : null;\n}\n\nexport function createWavefrontFrameTelemetryResources({\n device,\n constants,\n maxRayCountRecords,\n}) {\n const rayRecordCapacity = Math.max(1, Math.trunc(Number(maxRayCountRecords) || 1));\n const rayBufferBytes = rayRecordCapacity * Uint32Array.BYTES_PER_ELEMENT;\n const mapMode = constants.map;\n if (!mapMode || typeof mapMode.READ !== \"number\") {\n return Object.freeze({\n available: false,\n reason: \"gpu-map-read-unavailable\",\n memoryBytes: 0,\n beginFrame() {},\n recordActiveRayCount() {},\n decorateFirstPass(descriptor) {\n return descriptor;\n },\n decorateFinalPass(descriptor) {\n return descriptor;\n },\n async readFrame({ expectedPrimaryRays = 0, expectedRayCounts = 0 } = {}) {\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"unavailable\",\n expectedPrimaryRays,\n expectedRayCounts,\n reason: \"gpu-map-read-unavailable\",\n }),\n timestampQueryStatus: \"unsupported\",\n totalGpuTimeMs: null,\n reason: \"gpu-map-read-unavailable\",\n });\n },\n destroy() {},\n });\n }\n\n const rayCountBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n rayBufferBytes,\n \"plasius.wavefront.rayCounts\"\n );\n const rayCountReadbackBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n rayBufferBytes,\n \"plasius.wavefront.rayCounts.readback\"\n );\n\n const timestampFeatureAvailable = hasGpuFeature(device?.features, \"timestamp-query\");\n const timestampApiAvailable =\n timestampFeatureAvailable &&\n typeof device.createQuerySet === \"function\" &&\n typeof constants.buffer.QUERY_RESOLVE === \"number\";\n let timestampQuerySet = null;\n let timestampResolveBuffer = null;\n let timestampReadbackBuffer = null;\n let timestampSetupReason = timestampFeatureAvailable\n ? \"timestamp-query-api-unavailable\"\n : \"timestamp-query-unsupported\";\n if (timestampApiAvailable) {\n try {\n timestampQuerySet = device.createQuerySet({\n label: \"plasius.wavefront.timestamps\",\n type: \"timestamp\",\n count: TIMESTAMP_QUERY_COUNT,\n });\n timestampResolveBuffer = createBuffer(\n device,\n constants.buffer.QUERY_RESOLVE | constants.buffer.COPY_SRC,\n TIMESTAMP_BUFFER_BYTES,\n \"plasius.wavefront.timestamps.resolve\"\n );\n timestampReadbackBuffer = createBuffer(\n device,\n constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n TIMESTAMP_BUFFER_BYTES,\n \"plasius.wavefront.timestamps.readback\"\n );\n timestampSetupReason = null;\n } catch (error) {\n timestampQuerySet?.destroy?.();\n timestampQuerySet = null;\n timestampResolveBuffer?.destroy?.();\n timestampResolveBuffer = null;\n timestampReadbackBuffer?.destroy?.();\n timestampReadbackBuffer = null;\n timestampSetupReason = `timestamp-query-setup-failed:${safeErrorReason(error)}`;\n }\n }\n const timestampUnavailableStatus = timestampSetupReason?.startsWith(\n \"timestamp-query-setup-failed:\"\n )\n ? \"failed\"\n : \"unsupported\";\n\n let active = false;\n let recordCount = 0;\n let recordOverflow = false;\n let bounceIndices = [];\n let timestampStarted = false;\n let timestampEnded = false;\n let rayReadbackMapped = false;\n let timestampReadbackMapped = false;\n\n const memoryBytes =\n rayBufferBytes * 2 +\n (timestampQuerySet ? TIMESTAMP_BUFFER_BYTES * 2 : 0);\n\n function beginFrame() {\n active = true;\n recordCount = 0;\n recordOverflow = false;\n bounceIndices = [];\n timestampStarted = false;\n timestampEnded = false;\n }\n\n function recordActiveRayCount(encoder, counterBuffer, bounceIndex) {\n if (!active) {\n return;\n }\n if (recordCount >= rayRecordCapacity) {\n recordOverflow = true;\n return;\n }\n encoder.copyBufferToBuffer(\n counterBuffer,\n 0,\n rayCountBuffer,\n recordCount * Uint32Array.BYTES_PER_ELEMENT,\n Uint32Array.BYTES_PER_ELEMENT\n );\n bounceIndices.push(Math.max(0, Math.trunc(Number(bounceIndex) || 0)));\n recordCount += 1;\n }\n\n function decorateFirstPass(descriptor) {\n if (!active || !timestampQuerySet || timestampStarted) {\n return descriptor;\n }\n timestampStarted = true;\n return {\n ...descriptor,\n timestampWrites: {\n querySet: timestampQuerySet,\n beginningOfPassWriteIndex: 0,\n },\n };\n }\n\n function decorateFinalPass(descriptor) {\n if (!active || !timestampQuerySet || !timestampStarted || timestampEnded) {\n return descriptor;\n }\n timestampEnded = true;\n return {\n ...descriptor,\n timestampWrites: {\n querySet: timestampQuerySet,\n endOfPassWriteIndex: 1,\n },\n };\n }\n\n async function readFrame({\n expectedPrimaryRays = 0,\n expectedRayCounts = recordCount,\n waitForSubmittedGpuWork,\n } = {}) {\n active = false;\n if (recordOverflow || recordCount !== expectedRayCounts) {\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"failed\",\n expectedPrimaryRays,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: recordOverflow\n ? \"ray-count-record-capacity-exceeded\"\n : `ray-count-record-mismatch:${recordCount}/${expectedRayCounts}`,\n }),\n timestampQueryStatus: timestampQuerySet ? \"failed\" : timestampUnavailableStatus,\n totalGpuTimeMs: null,\n reason: \"ray-count-recording-incomplete\",\n });\n }\n\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.telemetry.readback\",\n });\n const rayCopyBytes = Math.max(\n Uint32Array.BYTES_PER_ELEMENT,\n recordCount * Uint32Array.BYTES_PER_ELEMENT\n );\n encoder.copyBufferToBuffer(rayCountBuffer, 0, rayCountReadbackBuffer, 0, rayCopyBytes);\n const canResolveTimestamps =\n timestampQuerySet &&\n timestampStarted &&\n timestampEnded &&\n typeof encoder.resolveQuerySet === \"function\";\n if (canResolveTimestamps) {\n encoder.resolveQuerySet(\n timestampQuerySet,\n 0,\n TIMESTAMP_QUERY_COUNT,\n timestampResolveBuffer,\n 0\n );\n encoder.copyBufferToBuffer(\n timestampResolveBuffer,\n 0,\n timestampReadbackBuffer,\n 0,\n TIMESTAMP_BUFFER_BYTES\n );\n }\n device.queue.submit([encoder.finish()]);\n\n try {\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await rayCountReadbackBuffer.mapAsync(mapMode.READ);\n rayReadbackMapped = true;\n const rayCopy = rayCountReadbackBuffer\n .getMappedRange()\n .slice(0, rayCopyBytes);\n const rayCounts = new Uint32Array(rayCopy, 0, recordCount);\n rayCountReadbackBuffer.unmap();\n rayReadbackMapped = false;\n\n let maximumBounceIndex = 0;\n for (const bounceIndex of bounceIndices) {\n maximumBounceIndex = Math.max(maximumBounceIndex, bounceIndex);\n }\n const bounceHistogram = Array.from({ length: maximumBounceIndex + 1 }, () => 0);\n let observedPrimaryRays = 0;\n let secondaryRays = 0;\n let totalPathSegments = 0;\n for (let index = 0; index < rayCounts.length; index += 1) {\n const count = Number(rayCounts[index] ?? 0);\n const bounceIndex = bounceIndices[index] ?? 0;\n bounceHistogram[bounceIndex] = (bounceHistogram[bounceIndex] ?? 0) + count;\n totalPathSegments += count;\n if (bounceIndex === 0) {\n observedPrimaryRays += count;\n } else {\n secondaryRays += count;\n }\n }\n const primaryCountsMatch = observedPrimaryRays === expectedPrimaryRays;\n const rayTelemetry = freezeRayCountTelemetry({\n status: primaryCountsMatch ? \"available\" : \"failed\",\n source: \"gpu-active-queue-readback\",\n expectedPrimaryRays,\n observedPrimaryRays,\n secondaryRays: primaryCountsMatch ? secondaryRays : null,\n totalPathSegments: primaryCountsMatch ? totalPathSegments : null,\n bounceHistogram,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: primaryCountsMatch\n ? null\n : `primary-ray-count-mismatch:${observedPrimaryRays}/${expectedPrimaryRays}`,\n });\n\n let timestampQueryStatus = timestampQuerySet ? \"failed\" : timestampUnavailableStatus;\n let totalGpuTimeMs = null;\n let timestampReason = timestampSetupReason;\n if (canResolveTimestamps) {\n try {\n await timestampReadbackBuffer.mapAsync(mapMode.READ);\n timestampReadbackMapped = true;\n const timestampCopy = timestampReadbackBuffer\n .getMappedRange()\n .slice(0, TIMESTAMP_BUFFER_BYTES);\n const timestamps = new BigUint64Array(timestampCopy);\n timestampReadbackBuffer.unmap();\n timestampReadbackMapped = false;\n totalGpuTimeMs = timestampDurationMs(timestamps);\n timestampQueryStatus = totalGpuTimeMs === null ? \"failed\" : \"available\";\n timestampReason =\n totalGpuTimeMs === null ? \"timestamp-query-returned-invalid-range\" : null;\n } catch (error) {\n if (timestampReadbackMapped) {\n timestampReadbackBuffer.unmap();\n timestampReadbackMapped = false;\n }\n timestampQueryStatus = \"failed\";\n timestampReason = `timestamp-query-readback-failed:${safeErrorReason(error)}`;\n }\n } else if (timestampQuerySet) {\n timestampReason = \"timestamp-query-span-incomplete\";\n }\n\n return Object.freeze({\n rayCounts: rayTelemetry,\n timestampQueryStatus,\n totalGpuTimeMs,\n reason: timestampReason,\n });\n } catch (error) {\n if (rayReadbackMapped) {\n rayCountReadbackBuffer.unmap();\n rayReadbackMapped = false;\n }\n if (timestampReadbackMapped) {\n timestampReadbackBuffer?.unmap();\n timestampReadbackMapped = false;\n }\n const reason = safeErrorReason(error);\n return Object.freeze({\n rayCounts: freezeRayCountTelemetry({\n status: \"failed\",\n expectedPrimaryRays,\n capturedRayCounts: recordCount,\n expectedRayCounts,\n reason: `ray-count-readback-failed:${reason}`,\n }),\n timestampQueryStatus: timestampQuerySet ? \"failed\" : timestampUnavailableStatus,\n totalGpuTimeMs: null,\n reason: `telemetry-readback-failed:${reason}`,\n });\n }\n }\n\n function destroy() {\n active = false;\n rayCountBuffer.destroy?.();\n rayCountReadbackBuffer.destroy?.();\n timestampQuerySet?.destroy?.();\n timestampResolveBuffer?.destroy?.();\n timestampReadbackBuffer?.destroy?.();\n }\n\n return Object.freeze({\n available: true,\n reason: null,\n memoryBytes,\n beginFrame,\n recordActiveRayCount,\n decorateFirstPass,\n decorateFinalPass,\n readFrame,\n destroy,\n });\n}\n","import { createGpuParallelismDiagnostics } from \"./wavefront-frame-runtime.js\";\nimport { createEnvironmentMapSnapshot } from \"./wavefront-runtime-support.js\";\nimport {\n clamp,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\nimport {\n createWavefrontFrameTimingTelemetry,\n createWavefrontRayCountTelemetry,\n} from \"./wavefront-frame-telemetry.js\";\n\nexport function resolveWavefrontRenderedSamplesPerPixel({\n config,\n renderOptions = {},\n awaitGPUCompletion = true,\n lastCompletedFrameTimeMs = null,\n lastCompletedSamplesPerPixel = 1,\n}) {\n const targetSamplesPerPixel = clamp(\n readPositiveInteger(\n \"samplesPerPixel\",\n renderOptions.samplesPerPixel,\n config.samplesPerPixel\n ),\n 1,\n config.samplesPerPixel\n );\n const frameTimeBudgetMs = Number.isFinite(renderOptions.frameTimeBudgetMs)\n ? Math.max(0, Number(renderOptions.frameTimeBudgetMs))\n : null;\n const minimumSamplesPerPixel = clamp(\n readPositiveInteger(\n \"minimumSamplesPerPixel\",\n renderOptions.minimumSamplesPerPixel,\n frameTimeBudgetMs !== null && targetSamplesPerPixel > 1 ? 1 : targetSamplesPerPixel\n ),\n 1,\n targetSamplesPerPixel\n );\n if (frameTimeBudgetMs === null || !awaitGPUCompletion || targetSamplesPerPixel <= minimumSamplesPerPixel) {\n return Object.freeze({\n renderedSamplesPerPixel: targetSamplesPerPixel,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: false,\n });\n }\n const estimatedSampleTimeMs =\n Number.isFinite(lastCompletedFrameTimeMs) && lastCompletedFrameTimeMs > 0\n ? lastCompletedFrameTimeMs / Math.max(1, lastCompletedSamplesPerPixel)\n : null;\n if (!Number.isFinite(estimatedSampleTimeMs) || estimatedSampleTimeMs <= 0) {\n return Object.freeze({\n renderedSamplesPerPixel: minimumSamplesPerPixel,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: minimumSamplesPerPixel < targetSamplesPerPixel,\n });\n }\n const budgetLimitedSamples = clamp(\n Math.floor(frameTimeBudgetMs / estimatedSampleTimeMs),\n minimumSamplesPerPixel,\n targetSamplesPerPixel\n );\n return Object.freeze({\n renderedSamplesPerPixel: budgetLimitedSamples,\n targetSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained: budgetLimitedSamples < targetSamplesPerPixel,\n });\n}\n\nexport function createWavefrontFrameStats({\n config,\n tiles,\n frame,\n frameIndex,\n accelerationBuilt,\n accelerationBuildCount,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n frameConfigSlotCount,\n gpuAdapterParallelism,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n}) {\n const gpuParallelism = createGpuParallelismDiagnostics(\n gpuAdapterParallelism,\n parallelismCounters\n );\n const commandSubmissions = frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0);\n return Object.freeze({\n frameStats: Object.freeze({\n frame,\n frameIndex,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tiles: tiles.length,\n tileSize: config.tileSize,\n samplesPerPixel: targetSamplesPerPixel,\n renderedSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n screenRays: config.width * config.height,\n primaryRays: config.width * config.height * renderedSamplesPerPixel,\n secondaryRays: null,\n totalPathSegments: null,\n rayCounts: createWavefrontRayCountTelemetry(),\n timings: createWavefrontFrameTimingTelemetry(),\n telemetryMemoryBytes: 0,\n sceneObjectCount: config.sceneObjectCount,\n triangleCount: config.triangleCount,\n emissiveTriangleCount: config.emissiveTriangleCount,\n environmentPortalCount: config.environmentPortalCount,\n environmentPortalMode: config.environmentPortalMode,\n mediumCount: config.mediumCount,\n environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n transportExperiments: config.transportExperiments,\n transportExperimentFlags: config.transportExperimentFlags,\n bvhNodeCount: config.bvhNodeCount,\n displayQuality: config.displayQuality,\n accelerationBuildMode: config.accelerationBuildMode,\n gpuAccelerationBuildRequired: config.gpuAccelerationBuildRequired,\n accelerationBuildSubmitted,\n accelerationBuilt,\n accelerationBuildCount,\n commandSubmissions,\n frameConfigSlots: frameConfigSlotCount,\n gpuParallelism,\n memory: config.memory,\n }),\n gpuParallelism,\n });\n}\n","import {\n recordDirectDispatch,\n recordIndirectDispatch,\n} from \"./wavefront-frame-runtime.js\";\nimport {\n COUNTER_DISPATCH_ARGS_OFFSET,\n INDIRECT_DISPATCH_ARGS_BYTES,\n WORKGROUP_SIZE,\n} from \"./wavefront-core.js\";\n\nfunction resolveGetter(valueOrGetter) {\n return typeof valueOrGetter === \"function\" ? valueOrGetter : () => valueOrGetter;\n}\n\nexport function createWavefrontFrameEncoder({\n getConfig,\n getBindGroups,\n pipelines,\n counterBuffer,\n activeDispatchBuffer,\n denoiseRadianceBindGroup,\n denoiseResolveBindGroup,\n denoiseDirectResolveBindGroup,\n presentPipeline,\n presentBindGroup,\n context,\n getFrameTelemetry = () => null,\n}) {\n const resolveConfig = resolveGetter(getConfig);\n const resolveBindGroups = resolveGetter(getBindGroups);\n\n return Object.freeze({\n encodeTileSample(encoder, tile, configOffset, parallelism) {\n const config = resolveConfig();\n const bindGroups = resolveBindGroups();\n const frameTelemetry = getFrameTelemetry();\n const generatePass = encoder.beginComputePass(\n frameTelemetry?.decorateFirstPass({\n label: \"plasius.wavefront.generatePrimaryRaysPass\",\n }) ?? { label: \"plasius.wavefront.generatePrimaryRaysPass\" }\n );\n const tileWorkgroups = Math.ceil((tile.width * tile.height) / WORKGROUP_SIZE);\n\n generatePass.setBindGroup(0, bindGroups[0], [configOffset]);\n generatePass.setPipeline(pipelines.generatePrimaryRays);\n generatePass.dispatchWorkgroups(tileWorkgroups);\n recordDirectDispatch(parallelism, [tileWorkgroups], WORKGROUP_SIZE);\n generatePass.end();\n\n for (let bounceIndex = 0; bounceIndex < config.maxDepth; bounceIndex += 1) {\n frameTelemetry?.recordActiveRayCount(encoder, counterBuffer, bounceIndex);\n encoder.copyBufferToBuffer(\n counterBuffer,\n COUNTER_DISPATCH_ARGS_OFFSET,\n activeDispatchBuffer,\n 0,\n INDIRECT_DISPATCH_ARGS_BYTES\n );\n const passEncoder = encoder.beginComputePass({\n label: `plasius.wavefront.bounce.${bounceIndex}`,\n });\n passEncoder.setBindGroup(0, bindGroups[bounceIndex % 2], [configOffset]);\n passEncoder.setPipeline(pipelines.intersectActiveQueue);\n passEncoder.dispatchWorkgroupsIndirect(activeDispatchBuffer, 0);\n recordIndirectDispatch(parallelism, tileWorkgroups, WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.resolveSurfaceRecords);\n passEncoder.dispatchWorkgroupsIndirect(activeDispatchBuffer, 0);\n recordIndirectDispatch(parallelism, tileWorkgroups, WORKGROUP_SIZE);\n passEncoder.setPipeline(pipelines.compactAndSwapQueues);\n passEncoder.dispatchWorkgroups(1);\n recordDirectDispatch(parallelism, [1], 1);\n passEncoder.end();\n }\n },\n\n encodeTileOutput(encoder, tile, configOffset, parallelism) {\n const bindGroups = resolveBindGroups();\n const passEncoder = encoder.beginComputePass({\n label: \"plasius.wavefront.outputPass\",\n });\n const tileWorkgroups = Math.ceil((tile.width * tile.height) / WORKGROUP_SIZE);\n\n passEncoder.setBindGroup(0, bindGroups[0], [configOffset]);\n passEncoder.setPipeline(pipelines.accumulateTerminalRadiance);\n passEncoder.dispatchWorkgroups(tileWorkgroups);\n recordDirectDispatch(parallelism, [tileWorkgroups], WORKGROUP_SIZE);\n passEncoder.end();\n },\n\n encodeDenoise(encoder, configOffset, parallelism, renderedSamplesPerPixel) {\n const config = resolveConfig();\n if (!config.denoise) {\n return;\n }\n const denoiseWorkgroupsX = Math.ceil(config.width / 8);\n const denoiseWorkgroupsY = Math.ceil(config.height / 8);\n const useTwoPassDenoise = renderedSamplesPerPixel < 4;\n if (useTwoPassDenoise) {\n const radiancePass = encoder.beginComputePass({\n label: \"plasius.wavefront.denoiseRadiancePass\",\n });\n radiancePass.setBindGroup(0, denoiseRadianceBindGroup, [configOffset]);\n radiancePass.setPipeline(pipelines.denoiseLinearRadiance);\n radiancePass.dispatchWorkgroups(denoiseWorkgroupsX, denoiseWorkgroupsY);\n recordDirectDispatch(\n parallelism,\n [denoiseWorkgroupsX, denoiseWorkgroupsY],\n WORKGROUP_SIZE\n );\n radiancePass.end();\n }\n\n const resolvePass = encoder.beginComputePass({\n label: \"plasius.wavefront.denoiseResolvePass\",\n });\n resolvePass.setBindGroup(\n 0,\n useTwoPassDenoise ? denoiseResolveBindGroup : denoiseDirectResolveBindGroup,\n [configOffset]\n );\n resolvePass.setPipeline(pipelines.resolveDenoisedOutputImage);\n resolvePass.dispatchWorkgroups(denoiseWorkgroupsX, denoiseWorkgroupsY);\n recordDirectDispatch(\n parallelism,\n [denoiseWorkgroupsX, denoiseWorkgroupsY],\n WORKGROUP_SIZE\n );\n resolvePass.end();\n },\n\n encodePresent(encoder) {\n const texture = context.getCurrentTexture();\n const descriptor = {\n label: \"plasius.wavefront.presentPass\",\n colorAttachments: [\n {\n view: texture.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n };\n const passEncoder = encoder.beginRenderPass(\n getFrameTelemetry()?.decorateFinalPass(descriptor) ?? descriptor\n );\n passEncoder.setPipeline(presentPipeline);\n passEncoder.setBindGroup(0, presentBindGroup);\n passEncoder.draw(3);\n passEncoder.end();\n },\n });\n}\n","import { createGpuSubmissionBatcher } from \"./wavefront-frame-runtime.js\";\nimport {\n clamp,\n readNonNegativeInteger,\n readPositiveInteger,\n} from \"./wavefront-core.js\";\n\nexport function dispatchWavefrontFrame({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n frameEncoder,\n createFrameConfigWriter,\n}) {\n const writeFrameConfig = createFrameConfigWriter(frameIndex);\n const batch = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n });\n\n for (const tile of tiles) {\n for (let sampleIndex = 0; sampleIndex < renderedSamplesPerPixel; sampleIndex += 1) {\n const configOffset = writeFrameConfig(tile, {\n sampleIndex,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n frameEncoder.encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, configOffset, parallelism);\n }\n }\n if (!config.deferredPathResolve) {\n const outputConfigOffset = writeFrameConfig(tile, {\n sampleIndex: 0,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, outputConfigOffset, parallelism);\n }\n }\n if (config.denoise) {\n const denoiseConfigOffset = writeFrameConfig(\n { x: 0, y: 0, width: config.width, height: config.height },\n { sampleIndex: 0, sampleWeight: 1 / renderedSamplesPerPixel }\n );\n const denoisePassCount = renderedSamplesPerPixel < 4 ? 2 : 1;\n frameEncoder.encodeDenoise(\n batch.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n frameEncoder.encodePresent(batch.reserve(1));\n return batch.flush();\n}\n\nexport function dispatchWavefrontFrameAwaitingGpu({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n frameEncoder,\n writeFrameConfigSlot,\n optionsForFrame = {},\n}) {\n const samplePassesPerSample = config.maxDepth + 1 + (config.deferredPathResolve ? 1 : 0);\n const denoisePassCount = config.denoise ? (renderedSamplesPerPixel < 4 ? 2 : 1) : 0;\n const tailPassCount = denoisePassCount + 1;\n const sampleBatchSize = Math.max(\n 1,\n Math.floor(\n Math.max(config.maxFramePassesPerSubmission - tailPassCount, 1) /\n Math.max(samplePassesPerSample, 1)\n )\n );\n const sampleRangeStart = clamp(\n readNonNegativeInteger(\"sampleRangeStart\", optionsForFrame.sampleRangeStart, 0),\n 0,\n renderedSamplesPerPixel\n );\n const sampleRangeEnd = clamp(\n readPositiveInteger(\"sampleRangeEnd\", optionsForFrame.sampleRangeEnd, renderedSamplesPerPixel),\n sampleRangeStart,\n renderedSamplesPerPixel\n );\n const includeDenoise = optionsForFrame.includeDenoise === true;\n const includePresent = optionsForFrame.includePresent === true;\n const tileStartIndex = clamp(\n readNonNegativeInteger(\"tileStartIndex\", optionsForFrame.tileStartIndex, 0),\n 0,\n tiles.length\n );\n const tileEndIndex = clamp(\n readPositiveInteger(\"tileEndIndex\", optionsForFrame.tileEndIndex, tiles.length),\n tileStartIndex,\n tiles.length\n );\n let submissionCount = Math.max(\n 0,\n readNonNegativeInteger(\"startingSubmissionCount\", optionsForFrame.startingSubmissionCount, 0)\n );\n let slot = Math.max(0, readNonNegativeInteger(\"startingSlot\", optionsForFrame.startingSlot, 0));\n\n for (const tile of tiles.slice(tileStartIndex, tileEndIndex)) {\n for (\n let sampleStart = sampleRangeStart;\n sampleStart < sampleRangeEnd;\n sampleStart += sampleBatchSize\n ) {\n const sampleEnd = Math.min(sampleRangeEnd, sampleStart + sampleBatchSize);\n const batch = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n for (let sampleIndex = sampleStart; sampleIndex < sampleEnd; sampleIndex += 1) {\n const configOffset = writeFrameConfigSlot(slot, tile, frameIndex, {\n sampleIndex,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n slot += 1;\n frameEncoder.encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, configOffset, parallelism);\n }\n }\n if (!config.deferredPathResolve && sampleRangeEnd >= renderedSamplesPerPixel) {\n const outputConfigOffset = writeFrameConfigSlot(slot, tile, frameIndex, {\n sampleIndex: 0,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n slot += 1;\n frameEncoder.encodeTileOutput(batch.reserve(1), tile, outputConfigOffset, parallelism);\n }\n batch.flush();\n submissionCount += batch.getSubmissionCount();\n }\n }\n\n if (includeDenoise || includePresent) {\n const tail = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n if (includeDenoise && config.denoise) {\n const denoiseConfigOffset = writeFrameConfigSlot(\n slot,\n { x: 0, y: 0, width: config.width, height: config.height },\n frameIndex,\n { sampleIndex: 0, sampleWeight: 1 / renderedSamplesPerPixel }\n );\n slot += 1;\n frameEncoder.encodeDenoise(\n tail.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n if (includePresent) {\n frameEncoder.encodePresent(tail.reserve(1));\n }\n tail.flush();\n submissionCount += tail.getSubmissionCount();\n }\n return Object.freeze({\n submissionCount,\n slot,\n });\n}\n","export const WAVEFRONT_SHADER_BVH_WGSL = `\nfn default_mesh_range() -> MeshRange {\n return MeshRange(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(0.72, 0.72, 0.68, 1.0),\n vec4<f32>(0.0),\n vec4<f32>(0.72, 0.0, 1.0, 1.45),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 1.0, 1.0),\n vec4<f32>(1.0, 1.0, 1.0, 0.0)\n );\n}\n\nfn mesh_range_for_triangle(triangleIndex: u32) -> MeshRange {\n var selected = default_mesh_range();\n for (var meshIndex = 0u; meshIndex < config.meshSourceCount; meshIndex = meshIndex + 1u) {\n let mesh = meshRanges[meshIndex];\n let triangleStart = mesh.firstTriangle;\n let triangleEnd = mesh.firstTriangle + mesh.triangleCount;\n if (triangleIndex >= triangleStart && triangleIndex < triangleEnd) {\n selected = mesh;\n break;\n }\n }\n return selected;\n}\n\nfn node_bounds_min(left: BvhNode, right: BvhNode) -> vec3<f32> {\n return min(left.boundsMin.xyz, right.boundsMin.xyz);\n}\n\nfn node_bounds_max(left: BvhNode, right: BvhNode) -> vec3<f32> {\n return max(left.boundsMax.xyz, right.boundsMax.xyz);\n}\n\nfn ordered_float_key(value: f32) -> u32 {\n let bits = bitcast<u32>(value);\n let sign = bits & 0x80000000u;\n let mask = select(0x80000000u, 0xffffffffu, sign != 0u);\n return bits ^ mask;\n}\n\nfn split_by_3(value: u32) -> u32 {\n var x = value & 0x000003ffu;\n x = (x | (x << 16u)) & 0x030000ffu;\n x = (x | (x << 8u)) & 0x0300f00fu;\n x = (x | (x << 4u)) & 0x030c30c3u;\n x = (x | (x << 2u)) & 0x09249249u;\n return x;\n}\n\nfn morton_key_from_centroid(centroid: vec3<f32>) -> u32 {\n let x = (ordered_float_key(centroid.x) >> 12u) & 0x000003ffu;\n let y = (ordered_float_key(centroid.y) >> 12u) & 0x000003ffu;\n let z = (ordered_float_key(centroid.z) >> 12u) & 0x000003ffu;\n return (split_by_3(x) << 2u) | (split_by_3(y) << 1u) | split_by_3(z);\n}\n\nfn leaf_ref_less(left: BvhLeafRef, right: BvhLeafRef) -> bool {\n if (left.key < right.key) {\n return true;\n }\n if (left.key > right.key) {\n return false;\n }\n return left.triangleIndex < right.triangleIndex;\n}\n\n@compute @workgroup_size(64)\nfn prepareMeshTrianglesAndLeaves(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let triangleIndex = globalId.x;\n if (triangleIndex >= config.triangleCount) {\n if (triangleIndex < config.bvhSortItemCount) {\n bvhLeafRefs[triangleIndex] = BvhLeafRef(0xffffffffu, 0xffffffffu, 0u, 0u);\n }\n return;\n }\n\n let mesh = mesh_range_for_triangle(triangleIndex);\n let localTriangle = triangleIndex - mesh.firstTriangle;\n let indexOffset = mesh.firstIndex + localTriangle * 3u;\n let index0 = meshIndices[indexOffset];\n let index1 = meshIndices[indexOffset + 1u];\n let index2 = meshIndices[indexOffset + 2u];\n let vertex0 = meshVertices[index0];\n let vertex1 = meshVertices[index1];\n let vertex2 = meshVertices[index2];\n let edge1 = vertex1.position.xyz - vertex0.position.xyz;\n let edge2 = vertex2.position.xyz - vertex0.position.xyz;\n let centroid = (vertex0.position.xyz + vertex1.position.xyz + vertex2.position.xyz) / 3.0;\n let faceNormal = safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n let n0 = select(faceNormal, safe_normalize(vertex0.normal.xyz, faceNormal), vertex0.normal.w > 0.5);\n let n1 = select(faceNormal, safe_normalize(vertex1.normal.xyz, faceNormal), vertex1.normal.w > 0.5);\n let n2 = select(faceNormal, safe_normalize(vertex2.normal.xyz, faceNormal), vertex2.normal.w > 0.5);\n let uv0 = select(vec2<f32>(0.0), vertex0.uv.xy, vertex0.uv.z > 0.5);\n let uv1 = select(vec2<f32>(0.0), vertex1.uv.xy, vertex1.uv.z > 0.5);\n let uv2 = select(vec2<f32>(0.0), vertex2.uv.xy, vertex2.uv.z > 0.5);\n\n var preparedTriangle = TriangleRecord();\n preparedTriangle.triangleId = triangleIndex;\n preparedTriangle.meshId = mesh.meshId;\n preparedTriangle.materialKind = mesh.materialKind;\n preparedTriangle.flags = mesh.flags;\n preparedTriangle.materialRefId = mesh.materialRefId;\n preparedTriangle.mediumRefId = mesh.mediumRefId;\n preparedTriangle.materialSlot = mesh.materialSlot;\n preparedTriangle.v0 = vec4<f32>(vertex0.position.xyz, 0.0);\n preparedTriangle.v1 = vec4<f32>(vertex1.position.xyz, 0.0);\n preparedTriangle.v2 = vec4<f32>(vertex2.position.xyz, 0.0);\n preparedTriangle.n0 = vec4<f32>(n0, 0.0);\n preparedTriangle.n1 = vec4<f32>(n1, 0.0);\n preparedTriangle.n2 = vec4<f32>(n2, 0.0);\n preparedTriangle.uv0uv1 = vec4<f32>(uv0, uv1);\n preparedTriangle.uv2Pad = vec4<f32>(uv2, 0.0, 0.0);\n preparedTriangle.color = mesh.color;\n preparedTriangle.emission = mesh.emission;\n preparedTriangle.material = mesh.material;\n preparedTriangle.materialResponse = mesh.materialResponse;\n preparedTriangle.materialExtension = mesh.materialExtension;\n preparedTriangle.specularColor = mesh.specularColor;\n preparedTriangle.baseColorAtlas = mesh.baseColorAtlas;\n preparedTriangle.metallicRoughnessAtlas = mesh.metallicRoughnessAtlas;\n preparedTriangle.normalAtlas = mesh.normalAtlas;\n preparedTriangle.occlusionAtlas = mesh.occlusionAtlas;\n preparedTriangle.emissiveAtlas = mesh.emissiveAtlas;\n preparedTriangle.textureSettings = mesh.textureSettings;\n preparedTriangle.materialExtension2 = vec4<f32>(0.0, 0.0, 1.3, 0.0);\n preparedTriangle.materialExtension3 = vec4<f32>(100.0, 400.0, 0.0, 0.0);\n preparedTriangle.clearcoatAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.clearcoatRoughnessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.clearcoatNormalAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.transmissionAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.thicknessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.sheenColorAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.sheenRoughnessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.specularAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.specularColorAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.iridescenceAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.iridescenceThicknessAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n preparedTriangle.anisotropyAtlas = vec4<f32>(0.0, 0.0, 1.0, 1.0);\n triangles[triangleIndex] = preparedTriangle;\n\n let leafBase = config.triangleCount - 1u;\n let nodeIndex = leafBase + triangleIndex;\n let boundsMin = min(vertex0.position.xyz, min(vertex1.position.xyz, vertex2.position.xyz));\n let boundsMax = max(vertex0.position.xyz, max(vertex1.position.xyz, vertex2.position.xyz));\n bvhLeafRefs[triangleIndex] = BvhLeafRef(\n morton_key_from_centroid(centroid),\n triangleIndex,\n 0u,\n 0u\n );\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(boundsMin, 0.0),\n vec4<f32>(boundsMax, 0.0),\n triangleIndex,\n 1u,\n 0u,\n 0u\n );\n}\n\n@compute @workgroup_size(64)\nfn sortBvhLeafRefs(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let sortCount = config.bvhSortItemCount;\n if (sortCount <= 1u || index >= sortCount) {\n return;\n }\n\n let compareDistance = config.bvhBuildNodeStart;\n let sequenceSize = config.bvhBuildNodeCount;\n if (compareDistance == 0u || sequenceSize == 0u) {\n return;\n }\n\n let partner = index ^ compareDistance;\n if (partner <= index || partner >= sortCount) {\n return;\n }\n\n let left = bvhLeafRefs[index];\n let right = bvhLeafRefs[partner];\n let ascending = (index & sequenceSize) == 0u;\n let leftIsLess = leaf_ref_less(left, right);\n let rightIsLess = leaf_ref_less(right, left);\n let shouldSwap = select(leftIsLess, rightIsLess, ascending);\n if (shouldSwap) {\n bvhLeafRefs[index] = right;\n bvhLeafRefs[partner] = left;\n }\n}\n\n@compute @workgroup_size(64)\nfn writeSortedBvhLeaves(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let sortedIndex = globalId.x;\n if (sortedIndex >= config.triangleCount || config.triangleCount == 0u) {\n return;\n }\n\n let leafRef = bvhLeafRefs[sortedIndex];\n if (leafRef.triangleIndex >= config.triangleCount) {\n return;\n }\n\n let triangle = triangles[leafRef.triangleIndex];\n let boundsMin = min(triangle.v0.xyz, min(triangle.v1.xyz, triangle.v2.xyz));\n let boundsMax = max(triangle.v0.xyz, max(triangle.v1.xyz, triangle.v2.xyz));\n let leafBase = config.triangleCount - 1u;\n let nodeIndex = leafBase + sortedIndex;\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(boundsMin, 0.0),\n vec4<f32>(boundsMax, 0.0),\n leafRef.triangleIndex,\n 1u,\n 0u,\n 0u\n );\n}\n\n@compute @workgroup_size(64)\nfn buildBvhInternalLevel(@builtin(global_invocation_id) globalId: vec3<u32>) {\n if (config.triangleCount <= 1u || globalId.x >= config.bvhBuildNodeCount) {\n return;\n }\n\n let internalCount = config.triangleCount - 1u;\n let nodeIndex = config.bvhBuildNodeStart + globalId.x;\n if (nodeIndex >= internalCount || nodeIndex >= config.bvhNodeCapacity) {\n return;\n }\n\n let leftIndex = nodeIndex * 2u + 1u;\n let rightIndex = nodeIndex * 2u + 2u;\n if (rightIndex >= config.bvhNodeCapacity || rightIndex >= config.bvhNodeCount) {\n return;\n }\n\n let left = bvhNodes[leftIndex];\n let right = bvhNodes[rightIndex];\n bvhNodes[nodeIndex] = BvhNode(\n vec4<f32>(node_bounds_min(left, right), 0.0),\n vec4<f32>(node_bounds_max(left, right), 0.0),\n leftIndex,\n 0u,\n rightIndex,\n 0u\n );\n}\n\nfn make_ray(pixelIndex: u32) -> RayRecord {\n let localX = pixelIndex % config.tileWidth;\n let localY = pixelIndex / config.tileWidth;\n let px = config.tileX + localX;\n let py = config.tileY + localY;\n let sampleId = u32(config.projectionAndSampling.w);\n let sourcePixelId = py * config.canvasWidth + px;\n let jitter = sample_dimension_2d(\n sourcePixelId,\n sampleId,\n 0u,\n config.frameIndex,\n SAMPLE_DIM_CAMERA_JITTER,\n config.samplesPerPixel\n ) - vec2<f32>(0.5);\n let jitterX = jitter.x;\n let jitterY = jitter.y;\n let ndcX = ((f32(px) + 0.5 + jitterX * 0.35) / f32(config.canvasWidth)) * 2.0 - 1.0;\n let ndcY = 1.0 - ((f32(py) + 0.5 + jitterY * 0.35) / f32(config.canvasHeight)) * 2.0;\n let viewX = ndcX * config.projectionAndSampling.x * config.projectionAndSampling.y;\n let viewY = ndcY * config.projectionAndSampling.x;\n let direction = safe_normalize(\n config.cameraForward.xyz + config.cameraRight.xyz * viewX + config.cameraUp.xyz * viewY,\n config.cameraForward.xyz\n );\n return RayRecord(\n pixelIndex,\n 0xffffffffu,\n sourcePixelId,\n sampleId,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(config.cameraPosition.xyz, 1.0),\n vec4<f32>(direction, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<u32>(0u)\n );\n}\n\nfn make_miss(ray: RayRecord) -> HitRecord {\n let radiance = gated_environment_radiance(ray.origin.xyz, ray.direction.xyz);\n return HitRecord(\n ray.rayId,\n ray.sourcePixelId,\n 2u,\n 0u,\n 0u,\n 1u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n -1.0,\n 1.0,\n vec2<f32>(0.0),\n vec4<f32>(ray.origin.xyz + ray.direction.xyz * 1000.0, 1.0),\n vec4<f32>(-ray.direction.xyz, 0.0),\n vec4<f32>(-ray.direction.xyz, 0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(radiance, 1.0),\n vec4<f32>(0.0),\n vec4<f32>(1.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(0.08, 1.0, 0.0, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0)\n );\n}\n\nfn intersect_sphere(ray: RayRecord, object: SceneObject) -> Candidate {\n let oc = ray.origin.xyz - object.center.xyz;\n let radius = max(object.halfExtent.x, 0.001);\n let halfB = dot(oc, ray.direction.xyz);\n let c = dot(oc, oc) - radius * radius;\n let discriminant = halfB * halfB - c;\n if (discriminant < 0.0) {\n return no_candidate();\n }\n let sqrtD = sqrt(discriminant);\n var distance = -halfB - sqrtD;\n if (distance <= 0.001) {\n distance = -halfB + sqrtD;\n }\n if (distance <= 0.001) {\n return no_candidate();\n }\n let position = ray.origin.xyz + ray.direction.xyz * distance;\n let outward = safe_normalize((position - object.center.xyz) / radius, vec3<f32>(0.0, 1.0, 0.0));\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, outward) < 0.0);\n let normal = select(-outward, outward, frontFace == 1u);\n return surface_candidate(\n distance,\n normal,\n normal,\n vec3<f32>(1.0, 0.0, 0.0),\n vec2<f32>(0.0),\n frontFace,\n 0xffffffffu,\n object.objectId,\n object.objectId,\n object.mediumRefId\n );\n}\n\nfn safe_inverse(value: f32) -> f32 {\n if (abs(value) < 0.000001) {\n return select(-1000000.0, 1000000.0, value >= 0.0);\n }\n return 1.0 / value;\n}\n\nfn intersect_box(ray: RayRecord, object: SceneObject) -> Candidate {\n let boxMin = object.center.xyz - object.halfExtent.xyz;\n let boxMax = object.center.xyz + object.halfExtent.xyz;\n let inv = vec3<f32>(\n safe_inverse(ray.direction.x),\n safe_inverse(ray.direction.y),\n safe_inverse(ray.direction.z)\n );\n let t0 = (boxMin - ray.origin.xyz) * inv;\n let t1 = (boxMax - ray.origin.xyz) * inv;\n let tNear = min(t0, t1);\n let tFar = max(t0, t1);\n let entry = max(max(tNear.x, tNear.y), tNear.z);\n let exit = min(min(tFar.x, tFar.y), tFar.z);\n if (exit < max(entry, 0.001)) {\n return no_candidate();\n }\n let distance = max(entry, 0.001);\n let position = ray.origin.xyz + ray.direction.xyz * distance;\n let rel = (position - object.center.xyz) / max(object.halfExtent.xyz, vec3<f32>(0.001));\n let absRel = abs(rel);\n var outward = vec3<f32>(0.0, 1.0, 0.0);\n if (absRel.x >= absRel.y && absRel.x >= absRel.z) {\n outward = vec3<f32>(select(-1.0, 1.0, rel.x >= 0.0), 0.0, 0.0);\n } else if (absRel.y >= absRel.z) {\n outward = vec3<f32>(0.0, select(-1.0, 1.0, rel.y >= 0.0), 0.0);\n } else {\n outward = vec3<f32>(0.0, 0.0, select(-1.0, 1.0, rel.z >= 0.0));\n }\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, outward) < 0.0);\n let normal = select(-outward, outward, frontFace == 1u);\n return surface_candidate(\n distance,\n normal,\n normal,\n vec3<f32>(1.0, 0.0, 0.0),\n vec2<f32>(0.0),\n frontFace,\n 0xffffffffu,\n object.objectId,\n object.objectId,\n object.mediumRefId\n );\n}\n\nfn intersect_bounds(ray: RayRecord, boundsMin: vec3<f32>, boundsMax: vec3<f32>, nearest: f32) -> bool {\n let inv = vec3<f32>(\n safe_inverse(ray.direction.x),\n safe_inverse(ray.direction.y),\n safe_inverse(ray.direction.z)\n );\n let t0 = (boundsMin - ray.origin.xyz) * inv;\n let t1 = (boundsMax - ray.origin.xyz) * inv;\n let tNear = min(t0, t1);\n let tFar = max(t0, t1);\n let entry = max(max(tNear.x, tNear.y), tNear.z);\n let exit = min(min(tFar.x, tFar.y), tFar.z);\n return exit >= max(entry, 0.001) && entry <= nearest;\n}\n\nfn repair_shading_normal(geometricNormal: vec3<f32>, shadingNormal: vec3<f32>) -> vec3<f32> {\n var normal = safe_normalize(shadingNormal, geometricNormal);\n if (dot(normal, geometricNormal) < 0.0) {\n normal = -normal;\n }\n return normal;\n}\n\nfn no_candidate() -> Candidate {\n return Candidate(\n 0u,\n 0.0,\n vec3<f32>(0.0, 1.0, 0.0),\n vec3<f32>(0.0, 1.0, 0.0),\n vec3<f32>(0.0),\n vec2<f32>(0.0),\n 1u,\n 0xffffffffu,\n 0xffffffffu,\n 0u,\n 0u\n );\n}\n\nfn surface_candidate(\n distance: f32,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n barycentric: vec3<f32>,\n uv: vec2<f32>,\n frontFace: u32,\n triangleIndex: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32\n) -> Candidate {\n return Candidate(\n 1u,\n distance,\n geometricNormal,\n shadingNormal,\n barycentric,\n uv,\n frontFace,\n triangleIndex,\n primitiveId,\n materialRefId,\n mediumRefId\n );\n}\n\nfn intersect_triangle(ray: RayRecord, triangle: TriangleRecord, triangleIndex: u32) -> Candidate {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n let pvec = cross(ray.direction.xyz, edge2);\n let det = dot(edge1, pvec);\n if (abs(det) < 0.0000001) {\n return no_candidate();\n }\n\n let invDet = 1.0 / det;\n let tvec = ray.origin.xyz - triangle.v0.xyz;\n let u = dot(tvec, pvec) * invDet;\n if (u < 0.0 || u > 1.0) {\n return no_candidate();\n }\n\n let qvec = cross(tvec, edge1);\n let v = dot(ray.direction.xyz, qvec) * invDet;\n if (v < 0.0 || u + v > 1.0) {\n return no_candidate();\n }\n\n let distance = dot(edge2, qvec) * invDet;\n if (distance <= 0.001) {\n return no_candidate();\n }\n\n let geometric = safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n let frontFace = select(0u, 1u, dot(ray.direction.xyz, geometric) < 0.0);\n let orientedGeometric = select(-geometric, geometric, frontFace == 1u);\n let w = 1.0 - u - v;\n let interpolated =\n triangle.n0.xyz * w +\n triangle.n1.xyz * u +\n triangle.n2.xyz * v;\n let shading = repair_shading_normal(orientedGeometric, interpolated);\n let barycentric = vec3<f32>(w, u, v);\n let uv =\n triangle.uv0uv1.xy * w +\n triangle.uv0uv1.zw * u +\n triangle.uv2Pad.xy * v;\n return surface_candidate(\n distance,\n orientedGeometric,\n shading,\n barycentric,\n uv,\n frontFace,\n triangleIndex,\n triangle.triangleId,\n triangle.materialRefId,\n triangle.mediumRefId\n );\n}\n\nfn intersect_bvh(ray: RayRecord, initialNearest: f32) -> Candidate {\n var nearest = initialNearest;\n var best = no_candidate();\n if (config.bvhNodeCount == 0u || config.triangleCount == 0u) {\n return best;\n }\n\n var stack = array<u32, 64>();\n var stackSize = 1u;\n stack[0] = 0u;\n\n loop {\n if (stackSize == 0u) {\n break;\n }\n\n stackSize = stackSize - 1u;\n let nodeIndex = stack[stackSize];\n if (nodeIndex >= config.bvhNodeCount) {\n continue;\n }\n\n let node = bvhNodes[nodeIndex];\n if (!intersect_bounds(ray, node.boundsMin.xyz, node.boundsMax.xyz, nearest)) {\n continue;\n }\n\n if (node.triangleCount > 0u) {\n for (var offset = 0u; offset < node.triangleCount; offset = offset + 1u) {\n let triangleIndex = node.childOrFirst + offset;\n if (triangleIndex >= config.triangleCount) {\n continue;\n }\n let current = intersect_triangle(ray, triangles[triangleIndex], triangleIndex);\n if (current.hit == 1u && current.distance < nearest) {\n nearest = current.distance;\n best = current;\n }\n }\n } else {\n if (stackSize + 2u <= 64u) {\n stack[stackSize] = node.childOrFirst;\n stack[stackSize + 1u] = node.rightChild;\n stackSize = stackSize + 2u;\n }\n }\n }\n\n return best;\n}\n`;\n","export const WAVEFRONT_SHADER_KERNELS_WGSL = `\nfn emission_power(emission: vec4<f32>) -> f32 {\n return emission.x + emission.y + emission.z;\n}\n\nfn sample_weight() -> f32 {\n return max(config.projectionAndSampling.z, 0.000001);\n}\n\nfn sanitize_linear_radiance_component(value: f32) -> f32 {\n let resolved = select(0.0, value, value == value);\n return clamp(resolved, 0.0, 65504.0);\n}\n\nfn sanitize_linear_radiance(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n sanitize_linear_radiance_component(value.x),\n sanitize_linear_radiance_component(value.y),\n sanitize_linear_radiance_component(value.z)\n );\n}\n\nfn radiance_sample_is_invalid(value: vec3<f32>) -> bool {\n return\n value.x != value.x || value.y != value.y || value.z != value.z ||\n value.x < 0.0 || value.y < 0.0 || value.z < 0.0 ||\n abs(value.x) > 65504.0 || abs(value.y) > 65504.0 || abs(value.z) > 65504.0;\n}\n\nfn radiance_sample_exceeds_legacy_clamp(value: vec3<f32>) -> bool {\n return value.x > 4.0 || value.y > 4.0 || value.z > 4.0;\n}\n\nfn record_radiance_diagnostics(sample: vec3<f32>) {\n if (radiance_sample_is_invalid(sample)) {\n atomicAdd(&counters.termination.invalidSampleCount, 1u);\n }\n if (radiance_sample_exceeds_legacy_clamp(sample)) {\n atomicAdd(&counters.termination.legacyClampEquivalentCount, 1u);\n }\n}\n\nfn tone_map_radiance(value: vec3<f32>) -> vec3<f32> {\n let mapped = value / (vec3<f32>(1.0) + value);\n return pow(clamp(mapped, vec3<f32>(0.0), vec3<f32>(1.0)), vec3<f32>(1.0 / 2.2));\n}\n\nfn present_radiance(value: vec3<f32>) -> vec3<f32> {\n let linearOutput = clamp(sanitize_linear_radiance(value), vec3<f32>(0.0), vec3<f32>(1.0));\n return select(tone_map_radiance(value), linearOutput, config.pathResolveSettings.w > 0.5);\n}\n\nfn scaled_termination_luminance(radiance: vec3<f32>) -> u32 {\n let averageLuminance =\n radiance_luminance(max(radiance, vec3<f32>(0.0))) / max(f32(config.tilePixelCount), 1.0);\n return u32(min(4294967295.0, round(averageLuminance * TERMINATION_LUMINANCE_SCALE)));\n}\n\nfn record_transport_contribution(kind: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n if (kind == TRANSPORT_BUCKET_DIRECT_EXPLICIT) {\n atomicAdd(&counters.termination.transportDirectExplicitLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TRANSPORT_BUCKET_CACHED_INDIRECT) {\n atomicAdd(&counters.termination.transportCachedIndirectLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL) {\n atomicAdd(&counters.termination.transportResidualLuminanceScaled, scaledLuminance);\n }\n}\n\nfn record_transport_checksum(pixelIndex: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n let weighted = (pixelIndex + 1u) * 2654435761u + (scaledLuminance + 1u) * 2246822519u;\n atomicAdd(&counters.termination.transportChecksum, weighted);\n}\n\nfn record_termination_metrics(kind: u32, radiance: vec3<f32>) {\n let scaledLuminance = scaled_termination_luminance(radiance);\n atomicAdd(&counters.termination.totalTerminalLuminanceScaled, scaledLuminance);\n if (\n max_component(radiance) <= 0.000001 &&\n (\n kind == TERMINAL_SOURCE_KIND_ABSORPTION_NULL ||\n kind == TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE ||\n kind == TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT ||\n kind == TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW ||\n kind == TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO\n )\n ) {\n atomicAdd(&counters.termination.transportZeroTerminationCount, 1u);\n }\n if (kind == TERMINAL_SOURCE_KIND_EMISSIVE) {\n atomicAdd(&counters.termination.emissiveCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_ENVIRONMENT) {\n atomicAdd(&counters.termination.environmentCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH) {\n atomicAdd(&counters.termination.ambientMaxDepthCount, 1u);\n atomicAdd(&counters.termination.ambientResidualLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW) {\n atomicAdd(&counters.termination.ambientQueueOverflowCount, 1u);\n atomicAdd(&counters.termination.ambientResidualLuminanceScaled, scaledLuminance);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_ABSORPTION_NULL) {\n atomicAdd(&counters.termination.absorptionNullCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE) {\n atomicAdd(&counters.termination.russianRouletteCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT) {\n atomicAdd(&counters.termination.strictMaxDepthCount, 1u);\n return;\n }\n if (kind == TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO) {\n atomicAdd(&counters.termination.deterministicResidualZeroCount, 1u);\n return;\n }\n}\n\nfn ray_workgroups_for_count(rayCount: u32) -> u32 {\n return max(1u, (rayCount + 63u) / 64u);\n}\n\nfn write_active_dispatch_args(activeCount: u32) {\n counters.dispatchX = ray_workgroups_for_count(activeCount);\n counters.dispatchY = 1u;\n counters.dispatchZ = 1u;\n counters.dispatchPad = 0u;\n}\n\nfn denoise_range_space(value: vec3<f32>) -> vec3<f32> {\n return value / (vec3<f32>(1.0) + value);\n}\n\nfn denoise_sample_count() -> f32 {\n return clamp(1.0 / max(config.projectionAndSampling.z, 0.000001), 1.0, 256.0);\n}\n\nfn denoise_strength() -> f32 {\n let spp = denoise_sample_count();\n return clamp(0.44 / sqrt(spp), 0.08, 0.44);\n}\n\nfn denoise_kernel_radius() -> i32 {\n return select(1i, 2i, denoise_sample_count() < 2.5);\n}\n\n@compute @workgroup_size(64)\nfn generatePrimaryRays(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n if (index == 0u) {\n atomicStore(&counters.activeCount, config.tilePixelCount);\n atomicStore(&counters.nextCount, 0u);\n atomicStore(&counters.terminatedCount, 0u);\n atomicStore(&counters.hitCount, 0u);\n atomicStore(&counters.termination.emissiveCount, 0u);\n atomicStore(&counters.termination.environmentCount, 0u);\n atomicStore(&counters.termination.ambientMaxDepthCount, 0u);\n atomicStore(&counters.termination.ambientQueueOverflowCount, 0u);\n atomicStore(&counters.termination.ambientResidualLuminanceScaled, 0u);\n atomicStore(&counters.termination.totalTerminalLuminanceScaled, 0u);\n atomicStore(&counters.termination.invalidSampleCount, 0u);\n atomicStore(&counters.termination.legacyClampEquivalentCount, 0u);\n atomicStore(&counters.termination.absorptionNullCount, 0u);\n atomicStore(&counters.termination.russianRouletteCount, 0u);\n atomicStore(&counters.termination.strictMaxDepthCount, 0u);\n atomicStore(&counters.termination.deterministicResidualZeroCount, 0u);\n atomicStore(&counters.termination.transportDirectExplicitLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportCachedIndirectLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportResidualLuminanceScaled, 0u);\n atomicStore(&counters.termination.transportZeroTerminationCount, 0u);\n atomicStore(&counters.termination.transportChecksum, 0u);\n atomicStore(&counters.termination.transportPad0, 0u);\n atomicStore(&counters.termination.transportPad1, 0u);\n atomicStore(&counters.termination.transportPad2, 0u);\n write_active_dispatch_args(config.tilePixelCount);\n }\n if (index >= config.tilePixelCount) {\n return;\n }\n activeQueue[index] = make_ray(index);\n clear_deferred_path(index);\n if (u32(config.projectionAndSampling.w) == 0u) {\n accumulation[index] = vec4<f32>(0.0);\n }\n}\n\n@compute @workgroup_size(64)\nfn intersectActiveQueue(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let activeCount = atomicLoad(&counters.activeCount);\n if (index >= activeCount) {\n return;\n }\n let ray = activeQueue[index];\n var nearest = 1000000.0;\n var hitObject = SceneObject(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(0.0),\n vec4<f32>(1.0, 0.0, 1.0, 1.0),\n vec4<f32>(0.0, 0.0, 0.0, 0.08),\n vec4<f32>(0.08, 1.0, 0.0, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0)\n );\n var candidate = no_candidate();\n var hitTriangle = TriangleRecord();\n\n for (var objectIndex = 0u; objectIndex < config.sceneObjectCount; objectIndex = objectIndex + 1u) {\n let object = sceneObjects[objectIndex];\n var current = no_candidate();\n if (object.kind == 1u) {\n current = intersect_sphere(ray, object);\n } else if (object.kind == 2u) {\n current = intersect_box(ray, object);\n }\n if (current.hit == 1u && current.distance < nearest) {\n nearest = current.distance;\n hitObject = object;\n candidate = current;\n }\n }\n\n let meshCandidate = intersect_bvh(ray, nearest);\n if (meshCandidate.hit == 1u && meshCandidate.distance < nearest) {\n nearest = meshCandidate.distance;\n candidate = meshCandidate;\n hitTriangle = triangles[meshCandidate.triangleIndex];\n }\n\n if (candidate.hit == 0u) {\n hits[index] = make_miss(ray);\n return;\n }\n\n let position = ray.origin.xyz + ray.direction.xyz * candidate.distance;\n let hitMaterialKind = select(hitObject.materialKind, hitTriangle.materialKind, candidate.triangleIndex != 0xffffffffu);\n let hitObjectId = select(hitObject.objectId, hitTriangle.meshId, candidate.triangleIndex != 0xffffffffu);\n let meshSurface = sample_surface_material(\n hitTriangle,\n candidate.uv,\n candidate.geometricNormal,\n candidate.shadingNormal\n );\n let hitColor = select(hitObject.color, meshSurface.color, candidate.triangleIndex != 0xffffffffu);\n let hitEmission = select(hitObject.emission, meshSurface.emission, candidate.triangleIndex != 0xffffffffu);\n let hitMaterial = select(hitObject.material, meshSurface.material, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialResponse = select(hitObject.materialResponse, meshSurface.materialResponse, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialExtension = select(hitObject.materialExtension, meshSurface.materialExtension, candidate.triangleIndex != 0xffffffffu);\n let hitSpecularColor = select(hitObject.specularColor, meshSurface.specularColor, candidate.triangleIndex != 0xffffffffu);\n let hitShadingNormal = select(candidate.shadingNormal, meshSurface.shadingNormal, candidate.triangleIndex != 0xffffffffu);\n let hitPrimitiveId = select(candidate.primitiveId, hitTriangle.triangleId, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialRefId = select(candidate.materialRefId, hitTriangle.materialRefId, candidate.triangleIndex != 0xffffffffu);\n let hitMediumRefId = select(candidate.mediumRefId, hitTriangle.mediumRefId, candidate.triangleIndex != 0xffffffffu);\n let hitMaterialSlot = select(0u, hitTriangle.materialSlot, candidate.triangleIndex != 0xffffffffu);\n let hitOcclusion = select(1.0, meshSurface.occlusion, candidate.triangleIndex != 0xffffffffu);\n var hitType = 0u;\n if (hitMaterialKind == 4u || emission_power(hitEmission) > 0.0001) {\n hitType = 1u;\n } else if (hitMaterialKind == 3u || hitMaterial.z < 0.999 || hitMaterialExtension.z > 0.001) {\n hitType = 3u;\n }\n atomicAdd(&counters.hitCount, 1u);\n hits[index] = HitRecord(\n ray.rayId,\n ray.sourcePixelId,\n hitType,\n hitObjectId,\n hitMaterialKind,\n candidate.frontFace,\n hitPrimitiveId,\n hitMaterialRefId,\n hitMediumRefId,\n hitMaterialSlot,\n 0u,\n 0u,\n candidate.distance,\n hitOcclusion,\n vec2<f32>(0.0),\n vec4<f32>(position, 1.0),\n vec4<f32>(candidate.geometricNormal, 0.0),\n vec4<f32>(hitShadingNormal, 0.0),\n vec4<f32>(candidate.barycentric, 0.0),\n vec4<f32>(candidate.uv, 0.0, 0.0),\n hitColor,\n hitEmission,\n hitMaterial,\n hitMaterialResponse,\n hitMaterialExtension,\n hitSpecularColor\n );\n}\n\nfn surface_shading_normal(hit: HitRecord) -> vec3<f32> {\n let geometric = safe_normalize(hit.geometricNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n return repair_shading_normal(geometric, hit.shadingNormal.xyz);\n}\n\nfn offset_origin(\n position: vec3<f32>,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n rayDirection: vec3<f32>\n) -> vec3<f32> {\n let geometric = safe_normalize(geometricNormal, vec3<f32>(0.0, 1.0, 0.0));\n let shading = repair_shading_normal(geometric, shadingNormal);\n let raySide = select(-1.0, 1.0, dot(rayDirection, geometric) >= 0.0);\n let orientedGeometric = geometric * raySide;\n var orientedShading = shading * raySide;\n if (dot(orientedShading, orientedGeometric) <= 0.0) {\n orientedShading = orientedGeometric;\n }\n let offsetNormal = safe_normalize(orientedGeometric + orientedShading, orientedGeometric);\n let positionScale = max(max(abs(position.x), abs(position.y)), abs(position.z));\n let positionAwareEpsilon = positionScale * 0.00000047683716;\n let offsetDistance = clamp(max(0.00025, positionAwareEpsilon), 0.00025, 0.01);\n return position + offsetNormal * offsetDistance;\n}\n\nfn schlick(cosine: f32, refractionRatio: f32) -> f32 {\n var r0 = (1.0 - refractionRatio) / (1.0 + refractionRatio);\n r0 = r0 * r0;\n return r0 + (1.0 - r0) * pow(1.0 - cosine, 5.0);\n}\n\nfn refract_direction(unitDirection: vec3<f32>, normal: vec3<f32>, etaRatio: f32) -> vec3<f32> {\n let cosTheta = min(dot(-unitDirection, normal), 1.0);\n let rOutPerp = etaRatio * (unitDirection + cosTheta * normal);\n let rOutParallel = -sqrt(abs(1.0 - dot(rOutPerp, rOutPerp))) * normal;\n return safe_normalize(rOutPerp + rOutParallel, reflect(unitDirection, normal));\n}\n\nfn surface_supports_direct_lighting(hit: HitRecord) -> bool {\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let deltaMetal = hit.materialKind == 1u && roughness <= 0.02;\n let refractive = hit.materialKind == 2u || hit.materialKind == 3u || transmission > 0.001;\n return !(deltaMetal || refractive);\n}\n\nfn sample_emissive_triangle_direction(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n fallback: vec3<f32>\n) -> vec3<f32> {\n let lightSample = sample_emissive_triangle_light(\n hit,\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n SAMPLE_DIM_GUIDED_EMISSIVE_SELECTION,\n SAMPLE_DIM_GUIDED_EMISSIVE_SURFACE\n );\n if (lightSample.valid == 0u) {\n return fallback;\n }\n return safe_normalize(lightSample.direction.xyz, fallback);\n}\n\nfn sample_environment_portal_direction(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n fallback: vec3<f32>\n) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return fallback;\n }\n let portalSlot = min(\n u32(\n sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, SAMPLE_DIM_GUIDED_PORTAL_SELECTION) *\n f32(config.environmentPortalCount)\n ),\n config.environmentPortalCount - 1u\n );\n let portal = environmentPortals[portalSlot];\n let portalUv = sample_dimension_2d(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n SAMPLE_DIM_GUIDED_PORTAL_SURFACE,\n config.samplesPerPixel\n ) * 2.0 - vec2<f32>(1.0);\n let u = portalUv.x * portal.tangent.w;\n let v = portalUv.y * portal.bitangent.w;\n let portalTarget = portal.position.xyz + portal.tangent.xyz * u + portal.bitangent.xyz * v;\n return safe_normalize(portalTarget - hit.position.xyz, fallback);\n}\n\nfn scatter_direction(ray: RayRecord, hit: HitRecord) -> ScatterResult {\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n if (hit.materialKind == 1u && roughness <= 0.02) {\n return ScatterResult(\n vec4<f32>(reflect(ray.direction.xyz, normal), 0.0),\n 1.0,\n ray.mediumRefId,\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_REFLECTION,\n );\n }\n\n if (hit.materialKind == 2u || hit.materialKind == 3u || transmission > 0.001) {\n let ior = max(hit.material.w, 1.01);\n let etaRatio = select(ior, 1.0 / ior, hit.frontFace == 1u);\n let cosTheta = min(dot(-ray.direction.xyz, normal), 1.0);\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let cannotRefract = etaRatio * sinTheta > 1.0;\n let reflectChance = schlick(cosTheta, etaRatio);\n let transmissionReflectChance = select(\n reflectChance,\n max(reflectChance, 1.0 - transmission),\n transmission > 0.001\n );\n let transmissionSelector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_TRANSMISSION_SELECTOR\n );\n if (cannotRefract || transmissionSelector < transmissionReflectChance) {\n return ScatterResult(\n vec4<f32>(reflect(ray.direction.xyz, normal), 0.0),\n 1.0,\n ray.mediumRefId,\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_REFLECTION,\n );\n }\n return ScatterResult(\n vec4<f32>(refract_direction(ray.direction.xyz, normal, etaRatio), 0.0),\n 1.0,\n transmitted_medium_ref_id(ray, hit),\n RAY_FLAG_DELTA_SAMPLE,\n SCATTER_LOBE_DELTA_TRANSMISSION,\n );\n }\n\n let guidedEmissiveAvailable = config.emissiveTriangleCount > 0u;\n let guidedPortalAvailable =\n config.environmentPortalCount > 0u && config.environmentPortalMode != 0u;\n let guidedSelector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_GUIDED_LIGHT_SELECTOR\n );\n if (guidedEmissiveAvailable && guidedSelector < 0.18) {\n let guidedDirection = sample_emissive_triangle_direction(\n hit,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n normal\n );\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(\n vec4<f32>(guidedDirection, 0.0),\n guidedPdf,\n ray.mediumRefId,\n RAY_FLAG_GUIDED_EMISSIVE,\n SCATTER_LOBE_DIFFUSE,\n );\n }\n }\n if (guidedPortalAvailable && guidedSelector < 0.32) {\n let guidedDirection = sample_environment_portal_direction(\n hit,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n normal\n );\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(\n vec4<f32>(guidedDirection, 0.0),\n guidedPdf,\n ray.mediumRefId,\n 0u,\n SCATTER_LOBE_DIFFUSE\n );\n }\n }\n\n let weights = surface_bsdf_sampling_weights(hit);\n let selector = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_BSDF_LOBE_SELECTOR\n );\n var lightDirection = normal;\n var lobeKind = SCATTER_LOBE_DIFFUSE;\n if (selector < weights.x) {\n let diffuseSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_DIFFUSE_HEMISPHERE,\n config.samplesPerPixel\n );\n lightDirection = cosine_sample_hemisphere(\n diffuseSample,\n normal\n );\n lobeKind = SCATTER_LOBE_DIFFUSE;\n } else if (selector < weights.x + weights.y) {\n let specularSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_SPECULAR_HALF_VECTOR,\n config.samplesPerPixel\n );\n let halfVector = importance_sample_ggx(\n specularSample,\n max(roughness, 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n lobeKind = SCATTER_LOBE_SPECULAR;\n } else {\n let clearcoatSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_CLEARCOAT_HALF_VECTOR,\n config.samplesPerPixel\n );\n let halfVector = importance_sample_ggx(\n clearcoatSample,\n max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n lobeKind = SCATTER_LOBE_CLEARCOAT;\n }\n if (dot(normal, lightDirection) <= 0.000001) {\n let fallbackSample = sample_dimension_2d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_FALLBACK_HEMISPHERE,\n config.samplesPerPixel\n );\n lightDirection = cosine_sample_hemisphere(\n fallbackSample,\n normal\n );\n lobeKind = SCATTER_LOBE_DIFFUSE;\n }\n let pdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, lightDirection), 0.000001);\n return ScatterResult(vec4<f32>(lightDirection, 0.0), pdf, ray.mediumRefId, 0u, lobeKind);\n}\n\n@compute @workgroup_size(64)\nfn resolveSurfaceRecords(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n let activeCount = atomicLoad(&counters.activeCount);\n if (index >= activeCount) {\n return;\n }\n\n let ray = activeQueue[index];\n let hit = hits[index];\n let segmentTransmittance = medium_transmittance(medium_stack_current_id(ray), hit.distance);\n let arrivingThroughput = ray.throughput.xyz * segmentTransmittance;\n var contribution = vec3<f32>(0.0);\n\n if (hit.hitType == 1u) {\n let guidedLightWeight = select(1.0, 0.24, (ray.flags & RAY_FLAG_GUIDED_EMISSIVE) != 0u);\n var sourceRadiance = max(hit.emission.xyz, hit.color.xyz) * guidedLightWeight;\n if ((ray.flags & RAY_FLAG_DELTA_SAMPLE) == 0u) {\n let bsdfPdf = max(ray.throughput.w, 0.000001);\n let lightPdf = terminal_emissive_light_pdf(ray, hit);\n if (lightPdf > 0.000001) {\n sourceRadiance = sourceRadiance * power_heuristic(bsdfPdf, lightPdf);\n }\n }\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n sourceRadiance * segmentTransmittance,\n TERMINAL_SOURCE_KIND_EMISSIVE\n );\n } else {\n let rawWeightedContribution = arrivingThroughput * sourceRadiance * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_EMISSIVE, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n if (hit.hitType == 2u) {\n var sourceRadiance = hit.color.xyz;\n if ((ray.flags & RAY_FLAG_DELTA_SAMPLE) == 0u) {\n let bsdfPdf = max(ray.throughput.w, 0.000001);\n let lightPdf = environment_direction_pdf(ray.direction.xyz);\n let misWeight = power_heuristic(bsdfPdf, lightPdf);\n sourceRadiance = sourceRadiance * misWeight;\n }\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n sourceRadiance * segmentTransmittance,\n TERMINAL_SOURCE_KIND_ENVIRONMENT\n );\n } else {\n let rawWeightedContribution = arrivingThroughput * sourceRadiance * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_ENVIRONMENT, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let shouldEstimateDirectLight = surface_supports_direct_lighting(hit);\n if (shouldEstimateDirectLight) {\n let directLight = surface_direct_light_contribution(\n RayRecord(\n ray.rayId,\n ray.parentRayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n ray.mediumRefId,\n ray.flags,\n ray.mediumStackDepth,\n ray.origin,\n ray.direction,\n vec4<f32>(arrivingThroughput, ray.throughput.w),\n ray.mediumStack\n ),\n hit\n );\n let sunLight = surface_procedural_sun_contribution(\n RayRecord(\n ray.rayId,\n ray.parentRayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n ray.mediumRefId,\n ray.flags,\n ray.mediumStackDepth,\n ray.origin,\n ray.direction,\n vec4<f32>(arrivingThroughput, ray.throughput.w),\n ray.mediumStack\n ),\n hit\n );\n let rawDirectLight = (directLight + sunLight) * sample_weight();\n record_radiance_diagnostics(rawDirectLight);\n let weightedDirectLight = sanitize_linear_radiance(rawDirectLight);\n record_transport_contribution(TRANSPORT_BUCKET_DIRECT_EXPLICIT, weightedDirectLight);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedDirectLight, 0.0);\n }\n\n if (ray.bounce + 1u >= config.maxDepth) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH\n );\n }\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n let rawWeightedContribution = terminalEnvironment * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let scatter = scatter_direction(ray, hit);\n let continuationNormal = surface_shading_normal(hit);\n let continuationViewDirection = safe_normalize(-ray.direction.xyz, continuationNormal);\n let continuationLightDirection = safe_normalize(scatter.direction.xyz, continuationNormal);\n var continuationThroughput = surface_continuation_throughput(\n hit,\n continuationViewDirection,\n continuationLightDirection,\n scatter\n ) * segmentTransmittance;\n if (max_component(continuationThroughput) <= 0.000001) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_ABSORPTION_NULL\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH\n );\n }\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n let rawWeightedContribution = terminalEnvironment * sample_weight();\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH, weightedContribution);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n let rouletteStartBounce = select(\n 2u,\n 6u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DEFER_LOW_SPP_RUSSIAN_ROULETTE) &&\n config.samplesPerPixel <= 8u\n );\n if (strict_physical_low_spp_lighting_enabled() && ray.bounce >= rouletteStartBounce) {\n let survivalProbability = clamp(max_component(continuationThroughput), 0.05, 0.95);\n let roulette = sample_dimension_1d(\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce,\n config.frameIndex,\n SAMPLE_DIM_RUSSIAN_ROULETTE\n );\n if (roulette > survivalProbability) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE\n );\n } else {\n record_termination_metrics(TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE, vec3<f32>(0.0));\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n continuationThroughput = continuationThroughput / survivalProbability;\n }\n let nextIndex = atomicAdd(&counters.nextCount, 1u);\n if (nextIndex >= config.tilePixelCount) {\n if (deferred_path_resolve_enabled()) {\n if (strict_physical_low_spp_lighting_enabled()) {\n record_deferred_terminal_source(\n ray,\n vec3<f32>(0.0),\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW\n );\n } else {\n record_deferred_terminal_source(\n ray,\n terminal_surface_environment_source(ray, hit),\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW\n );\n }\n } else {\n var rawWeightedContribution = vec3<f32>(0.0);\n if (\n !strict_physical_low_spp_lighting_enabled() ||\n !transport_experiment_enabled(TRANSPORT_EXPERIMENT_STRICT_ZERO_OVERFLOW)\n ) {\n let overflowEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n rawWeightedContribution = overflowEnvironment * sample_weight();\n }\n record_radiance_diagnostics(rawWeightedContribution);\n let weightedContribution = sanitize_linear_radiance(rawWeightedContribution);\n record_termination_metrics(\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW,\n weightedContribution\n );\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(weightedContribution, 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n record_deferred_path_throughput(ray, continuationThroughput);\n let throughput = ray.throughput.xyz * continuationThroughput;\n let transmissionBranch = scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION;\n let nextMediumStack = select(\n transitioned_medium_stack(ray, hit),\n ray.mediumStack,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n let nextMediumStackDepth = select(\n transitioned_medium_stack_depth(ray, hit),\n ray.mediumStackDepth,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n let nextMediumRefId = select(\n transmitted_medium_ref_id(ray, hit),\n ray.mediumRefId,\n scatter.lobeKind != SCATTER_LOBE_DELTA_TRANSMISSION\n );\n nextQueue[nextIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n nextMediumRefId,\n scatter.flags,\n nextMediumStackDepth,\n vec4<f32>(\n offset_origin(\n hit.position.xyz,\n hit.geometricNormal.xyz,\n hit.shadingNormal.xyz,\n scatter.direction.xyz\n ),\n 1.0\n ),\n scatter.direction,\n vec4<f32>(throughput, scatter.pdf),\n nextMediumStack\n );\n\n // Keep both sides of a dielectric event when queue capacity permits. The\n // selected continuation remains the primary sample; this bounded second\n // record preserves a reflected/transmitted branch for explicit transport.\n if (\n scatter.lobeKind == SCATTER_LOBE_DELTA_REFLECTION ||\n scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION\n ) {\n let secondaryIndex = atomicAdd(&counters.nextCount, 1u);\n if (secondaryIndex < config.tilePixelCount) {\n let secondaryIsReflection = transmissionBranch;\n let secondaryDirection = select(\n refract_direction(ray.direction.xyz, surface_shading_normal(hit),\n select(1.0 / max(hit.material.w, 1.01), max(hit.material.w, 1.01), hit.frontFace == 1u)),\n reflect(ray.direction.xyz, surface_shading_normal(hit)),\n secondaryIsReflection\n );\n let secondaryThroughput = select(\n surface_delta_transmission_throughput(hit, continuationViewDirection),\n surface_delta_reflection_throughput(hit, continuationViewDirection),\n secondaryIsReflection\n ) * segmentTransmittance;\n let secondaryStack = select(\n transitioned_medium_stack(ray, hit),\n ray.mediumStack,\n secondaryIsReflection\n );\n let secondaryDepth = select(\n transitioned_medium_stack_depth(ray, hit),\n ray.mediumStackDepth,\n secondaryIsReflection\n );\n let secondaryMedium = select(\n transmitted_medium_ref_id(ray, hit),\n ray.mediumRefId,\n secondaryIsReflection\n );\n nextQueue[secondaryIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n secondaryMedium,\n scatter.flags,\n secondaryDepth,\n vec4<f32>(\n offset_origin(\n hit.position.xyz,\n hit.geometricNormal.xyz,\n hit.shadingNormal.xyz,\n secondaryDirection\n ),\n 1.0\n ),\n vec4<f32>(secondaryDirection, 0.0),\n vec4<f32>(ray.throughput.xyz * secondaryThroughput, scatter.pdf),\n secondaryStack\n );\n }\n }\n}\n\n@compute @workgroup_size(1)\nfn compactAndSwapQueues(@builtin(global_invocation_id) globalId: vec3<u32>) {\n if (globalId.x > 0u) {\n return;\n }\n let nextCount = atomicLoad(&counters.nextCount);\n let activeCount = min(nextCount, config.tilePixelCount);\n atomicStore(&counters.activeCount, activeCount);\n atomicStore(&counters.nextCount, 0u);\n write_active_dispatch_args(activeCount);\n}\n\nfn resolve_deferred_path_radiance(rayId: u32) -> vec3<f32> {\n let terminal = pathVertices[path_vertex_index(rayId, config.maxDepth)];\n if (terminal.w <= 0.0) {\n return vec3<f32>(0.0);\n }\n\n var radiance = terminal.xyz;\n var depth = config.maxDepth;\n loop {\n if (depth == 0u) {\n break;\n }\n depth = depth - 1u;\n let throughput = pathVertices[path_vertex_index(rayId, depth)];\n if (throughput.w > 0.0) {\n radiance = radiance * throughput.xyz;\n }\n }\n return sanitize_linear_radiance(radiance);\n}\n\n@compute @workgroup_size(64)\nfn accumulateTerminalRadiance(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let index = globalId.x;\n if (index >= config.tilePixelCount) {\n return;\n }\n let localX = index % config.tileWidth;\n let localY = index / config.tileWidth;\n let pixel = vec2<i32>(i32(config.tileX + localX), i32(config.tileY + localY));\n var radiance = max(accumulation[index].xyz, vec3<f32>(0.0));\n if (deferred_path_resolve_enabled()) {\n let terminal = pathVertices[path_vertex_index(index, config.maxDepth)];\n let resolved = resolve_deferred_path_radiance(index) * sample_weight();\n record_radiance_diagnostics(resolved);\n let safeResolved = sanitize_linear_radiance(resolved);\n record_transport_contribution(TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL, safeResolved);\n record_termination_metrics(u32(terminal.w), safeResolved);\n radiance = sanitize_linear_radiance(radiance + safeResolved);\n accumulation[index] = vec4<f32>(radiance, 1.0);\n }\n\n let linearOutput = sanitize_linear_radiance(radiance);\n record_transport_checksum(index, linearOutput);\n textureStore(radianceImage, pixel, vec4<f32>(linearOutput, 1.0));\n if (config.denoise == 0u) {\n textureStore(outputImage, pixel, vec4<f32>(present_radiance(linearOutput), 1.0));\n }\n}\n\n@compute @workgroup_size(8, 8)\nfn denoiseLinearRadiance(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let x = globalId.x;\n let y = globalId.y;\n if (x >= config.canvasWidth || y >= config.canvasHeight) {\n return;\n }\n\n let pixel = vec2<i32>(i32(x), i32(y));\n let center = textureLoad(denoiseInputRadiance, pixel, 0).xyz;\n let strength = denoise_strength();\n let kernelRadius = denoise_kernel_radius();\n let centerWeight = 1.7 - strength * 0.35;\n var sum = center * centerWeight;\n var totalWeight = centerWeight;\n let centerRange = denoise_range_space(center);\n\n for (var oy = -2i; oy <= 2i; oy = oy + 1i) {\n for (var ox = -2i; ox <= 2i; ox = ox + 1i) {\n if (ox == 0i && oy == 0i) {\n continue;\n }\n if (abs(ox) > kernelRadius || abs(oy) > kernelRadius) {\n continue;\n }\n let sx = clamp(i32(x) + ox, 0i, i32(config.canvasWidth) - 1i);\n let sy = clamp(i32(y) + oy, 0i, i32(config.canvasHeight) - 1i);\n let sampleColor = textureLoad(denoiseInputRadiance, vec2<i32>(sx, sy), 0).xyz;\n let colorDistance = length(denoise_range_space(sampleColor) - centerRange);\n let rangeWeight = 1.0 / (1.0 + colorDistance * (11.0 + strength * 6.0));\n let distanceWeight = 1.0 / (1.0 + f32(ox * ox + oy * oy) * (0.62 + strength * 0.24));\n let diagonalWeight = select(1.0, 0.92, abs(ox) + abs(oy) > 1i);\n let weight = rangeWeight * diagonalWeight * distanceWeight;\n sum = sum + sampleColor * weight;\n totalWeight = totalWeight + weight;\n }\n }\n\n let filtered = sum / max(totalWeight, 0.0001);\n let outlier = saturate(length(denoise_range_space(center) - denoise_range_space(filtered)) * 2.1);\n let blend = min(0.3, strength * (0.62 + outlier * 0.12));\n let color = min(mix(center, filtered, blend), vec3<f32>(16.0));\n textureStore(denoisedRadianceImage, pixel, vec4<f32>(color, 1.0));\n}\n\n@compute @workgroup_size(8, 8)\nfn resolveDenoisedOutputImage(@builtin(global_invocation_id) globalId: vec3<u32>) {\n let x = globalId.x;\n let y = globalId.y;\n if (x >= config.canvasWidth || y >= config.canvasHeight) {\n return;\n }\n\n let pixel = vec2<i32>(i32(x), i32(y));\n let center = textureLoad(finalDenoiseInputRadiance, pixel, 0).xyz;\n let strength = denoise_strength();\n let centerWeight = 1.35 - strength * 0.25;\n var sum = center * centerWeight;\n var totalWeight = centerWeight;\n let centerRange = denoise_range_space(center);\n\n for (var oy = -1i; oy <= 1i; oy = oy + 1i) {\n for (var ox = -1i; ox <= 1i; ox = ox + 1i) {\n if (ox == 0i && oy == 0i) {\n continue;\n }\n let sx = clamp(i32(x) + ox, 0i, i32(config.canvasWidth) - 1i);\n let sy = clamp(i32(y) + oy, 0i, i32(config.canvasHeight) - 1i);\n let sampleColor = textureLoad(finalDenoiseInputRadiance, vec2<i32>(sx, sy), 0).xyz;\n let colorDistance = length(denoise_range_space(sampleColor) - centerRange);\n let rangeWeight = 1.0 / (1.0 + colorDistance * (12.0 + strength * 8.0));\n let distanceWeight = 1.0 / (1.0 + f32(ox * ox + oy * oy) * (0.82 + strength * 0.28));\n let weight = rangeWeight * distanceWeight;\n sum = sum + sampleColor * weight;\n totalWeight = totalWeight + weight;\n }\n }\n\n let filtered = sum / max(totalWeight, 0.0001);\n let outlier = saturate(length(denoise_range_space(center) - denoise_range_space(filtered)) * 2.2);\n let blend = min(0.18, strength * (0.42 + outlier * 0.08));\n let radiance = min(mix(center, filtered, blend), vec3<f32>(16.0));\n textureStore(denoisedOutputImage, pixel, vec4<f32>(present_radiance(radiance), 1.0));\n}\n`;\n","import { hashUint32, mixSeed, random01FromSeed } from \"./wavefront-core.js\";\n\nconst sampleDimensionEntries = Object.freeze([\n [\"cameraJitter\", 1],\n [\"transmissionSelector\", 11],\n [\"guidedLightSelector\", 12],\n [\"guidedEmissiveSelection\", 13],\n [\"guidedEmissiveSurface\", 14],\n [\"guidedPortalSelection\", 15],\n [\"guidedPortalSurface\", 16],\n [\"bsdfLobeSelector\", 21],\n [\"diffuseHemisphere\", 22],\n [\"specularHalfVector\", 23],\n [\"clearcoatHalfVector\", 24],\n [\"fallbackHemisphere\", 25],\n [\"russianRoulette\", 26],\n [\"emissiveLightSelection\", 31],\n [\"emissiveLightSurface\", 32],\n [\"directLightSelector\", 41],\n [\"directEnvironment\", 42],\n]);\n\nfunction toWgslConstName(name) {\n return `SAMPLE_DIM_${name.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toUpperCase()}`;\n}\n\nconst usedDimensions = new Set();\nfor (const [, dimension] of sampleDimensionEntries) {\n if (usedDimensions.has(dimension)) {\n throw new Error(`Duplicate wavefront sample dimension ${dimension}.`);\n }\n usedDimensions.add(dimension);\n}\n\nexport const WAVEFRONT_SAMPLE_DIMENSIONS = Object.freeze(\n Object.fromEntries(sampleDimensionEntries)\n);\n\nexport function listWavefrontSampleDimensions() {\n return sampleDimensionEntries.map(([name, dimension]) =>\n Object.freeze({\n name,\n dimension,\n wgslName: toWgslConstName(name),\n })\n );\n}\n\nexport const WAVEFRONT_SAMPLE_DIMENSIONS_WGSL = listWavefrontSampleDimensions()\n .map(({ wgslName, dimension }) => `const ${wgslName}: u32 = ${dimension}u;`)\n .join(\"\\n\");\n\nfunction fract(value) {\n return value - Math.floor(value);\n}\n\nexport function radicalInverseVdc(value) {\n let bits = value >>> 0;\n bits = ((bits << 16) | (bits >>> 16)) >>> 0;\n bits = (((bits & 0x55555555) << 1) | ((bits & 0xaaaaaaaa) >>> 1)) >>> 0;\n bits = (((bits & 0x33333333) << 2) | ((bits & 0xcccccccc) >>> 2)) >>> 0;\n bits = (((bits & 0x0f0f0f0f) << 4) | ((bits & 0xf0f0f0f0) >>> 4)) >>> 0;\n bits = (((bits & 0x00ff00ff) << 8) | ((bits & 0xff00ff00) >>> 8)) >>> 0;\n return bits / 0x100000000;\n}\n\nexport function sampleWavefrontDimension1D(pixelId, sampleId, bounce, frameIndex, dimension) {\n return random01FromSeed(mixSeed(pixelId, sampleId, bounce, frameIndex, dimension));\n}\n\nexport function sampleWavefrontDimension2D(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n dimension,\n strataCount\n) {\n const strata = Math.max(1, Number.isFinite(strataCount) ? Math.trunc(strataCount) : 1);\n const jitter = sampleWavefrontDimension1D(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n dimension\n );\n const scramble = hashUint32(mixSeed(pixelId, sampleId, bounce, frameIndex, dimension));\n const stratified = fract((((sampleId >>> 0) % strata) + jitter) / strata);\n const lowDiscrepancy = fract(radicalInverseVdc((sampleId >>> 0) ^ scramble) + jitter);\n return Object.freeze([stratified, lowDiscrepancy]);\n}\n","import { WAVEFRONT_SAMPLE_DIMENSIONS_WGSL } from \"./wavefront-sampling-dimensions.js\";\n\nexport const WAVEFRONT_SHADER_LAYOUT_WGSL = `\nconst RAY_FLAG_GUIDED_EMISSIVE: u32 = 1u;\nconst RAY_FLAG_DELTA_SAMPLE: u32 = 2u;\nconst DIRECT_LIGHT_FLAG_DELTA: u32 = 1u;\nconst DIRECT_LIGHT_FLAG_PHYSICAL_SUN: u32 = 2u;\nconst SCATTER_LOBE_DIFFUSE: u32 = 1u;\nconst SCATTER_LOBE_SPECULAR: u32 = 2u;\nconst SCATTER_LOBE_CLEARCOAT: u32 = 3u;\nconst SCATTER_LOBE_DELTA_REFLECTION: u32 = 4u;\nconst SCATTER_LOBE_DELTA_TRANSMISSION: u32 = 5u;\n${WAVEFRONT_SAMPLE_DIMENSIONS_WGSL}\n\nstruct RayRecord {\n rayId: u32,\n parentRayId: u32,\n sourcePixelId: u32,\n sampleId: u32,\n bounce: u32,\n mediumRefId: u32,\n flags: u32,\n mediumStackDepth: u32,\n origin: vec4<f32>,\n direction: vec4<f32>,\n throughput: vec4<f32>,\n mediumStack: vec4<u32>,\n};\n\nstruct HitRecord {\n rayId: u32,\n sourcePixelId: u32,\n hitType: u32,\n objectId: u32,\n materialKind: u32,\n frontFace: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32,\n materialSlot: u32,\n pad0: u32,\n pad1: u32,\n distance: f32,\n occlusion: f32,\n pad2: vec2<f32>,\n position: vec4<f32>,\n geometricNormal: vec4<f32>,\n shadingNormal: vec4<f32>,\n barycentric: vec4<f32>,\n uv: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n};\n\nstruct SceneObject {\n kind: u32,\n objectId: u32,\n materialKind: u32,\n flags: u32,\n mediumRefId: u32,\n pad0: u32,\n pad1: u32,\n pad2: u32,\n center: vec4<f32>,\n halfExtent: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n};\n\nstruct TriangleRecord {\n triangleId: u32,\n meshId: u32,\n materialKind: u32,\n flags: u32,\n materialRefId: u32,\n mediumRefId: u32,\n materialSlot: u32,\n pad1: u32,\n v0: vec4<f32>,\n v1: vec4<f32>,\n v2: vec4<f32>,\n n0: vec4<f32>,\n n1: vec4<f32>,\n n2: vec4<f32>,\n uv0uv1: vec4<f32>,\n uv2Pad: vec4<f32>,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n baseColorAtlas: vec4<f32>,\n metallicRoughnessAtlas: vec4<f32>,\n normalAtlas: vec4<f32>,\n occlusionAtlas: vec4<f32>,\n emissiveAtlas: vec4<f32>,\n textureSettings: vec4<f32>,\n materialExtension2: vec4<f32>,\n materialExtension3: vec4<f32>,\n clearcoatAtlas: vec4<f32>,\n clearcoatRoughnessAtlas: vec4<f32>,\n clearcoatNormalAtlas: vec4<f32>,\n transmissionAtlas: vec4<f32>,\n thicknessAtlas: vec4<f32>,\n sheenColorAtlas: vec4<f32>,\n sheenRoughnessAtlas: vec4<f32>,\n specularAtlas: vec4<f32>,\n specularColorAtlas: vec4<f32>,\n iridescenceAtlas: vec4<f32>,\n iridescenceThicknessAtlas: vec4<f32>,\n anisotropyAtlas: vec4<f32>,\n};\n\nstruct BvhNode {\n boundsMin: vec4<f32>,\n boundsMax: vec4<f32>,\n childOrFirst: u32,\n triangleCount: u32,\n rightChild: u32,\n pad0: u32,\n};\n\nstruct BvhLeafRef {\n key: u32,\n triangleIndex: u32,\n pad0: u32,\n pad1: u32,\n};\n\nstruct ScatterResult {\n direction: vec4<f32>,\n pdf: f32,\n mediumRefId: u32,\n flags: u32,\n lobeKind: u32,\n};\n\nstruct MeshVertex {\n position: vec4<f32>,\n normal: vec4<f32>,\n uv: vec4<f32>,\n};\n\nstruct MeshRange {\n meshId: u32,\n materialKind: u32,\n flags: u32,\n materialRefId: u32,\n mediumRefId: u32,\n firstIndex: u32,\n indexCount: u32,\n firstTriangle: u32,\n triangleCount: u32,\n firstVertex: u32,\n vertexCount: u32,\n materialSlot: u32,\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n baseColorAtlas: vec4<f32>,\n metallicRoughnessAtlas: vec4<f32>,\n normalAtlas: vec4<f32>,\n occlusionAtlas: vec4<f32>,\n emissiveAtlas: vec4<f32>,\n textureSettings: vec4<f32>,\n};\n\nstruct FrameConfig {\n canvasWidth: u32,\n canvasHeight: u32,\n tileX: u32,\n tileY: u32,\n tileWidth: u32,\n tileHeight: u32,\n tilePixelCount: u32,\n maxDepth: u32,\n sceneObjectCount: u32,\n frameIndex: u32,\n denoise: u32,\n triangleCount: u32,\n bvhNodeCount: u32,\n displayQuality: u32,\n meshSourceCount: u32,\n bvhNodeCapacity: u32,\n cameraPosition: vec4<f32>,\n cameraForward: vec4<f32>,\n cameraRight: vec4<f32>,\n cameraUp: vec4<f32>,\n projectionAndSampling: vec4<f32>,\n environmentColor: vec4<f32>,\n ambientColor: vec4<f32>,\n environmentHorizonColor: vec4<f32>,\n environmentZenithColor: vec4<f32>,\n environmentSunDirectionIntensity: vec4<f32>,\n environmentSunColor: vec4<f32>,\n bvhBuildNodeStart: u32,\n bvhBuildNodeCount: u32,\n bvhSortItemCount: u32,\n emissiveTriangleCount: u32,\n environmentPortalCount: u32,\n environmentPortalMode: u32,\n samplesPerPixel: u32,\n transportExperimentFlags: u32,\n environmentMapSettings: vec4<f32>,\n pathResolveSettings: vec4<f32>,\n environmentMapMeta: vec4<f32>,\n};\n\nstruct TerminationMetrics {\n emissiveCount: atomic<u32>,\n environmentCount: atomic<u32>,\n ambientMaxDepthCount: atomic<u32>,\n ambientQueueOverflowCount: atomic<u32>,\n ambientResidualLuminanceScaled: atomic<u32>,\n totalTerminalLuminanceScaled: atomic<u32>,\n invalidSampleCount: atomic<u32>,\n legacyClampEquivalentCount: atomic<u32>,\n absorptionNullCount: atomic<u32>,\n russianRouletteCount: atomic<u32>,\n strictMaxDepthCount: atomic<u32>,\n deterministicResidualZeroCount: atomic<u32>,\n transportDirectExplicitLuminanceScaled: atomic<u32>,\n transportCachedIndirectLuminanceScaled: atomic<u32>,\n transportResidualLuminanceScaled: atomic<u32>,\n transportZeroTerminationCount: atomic<u32>,\n transportChecksum: atomic<u32>,\n transportPad0: atomic<u32>,\n transportPad1: atomic<u32>,\n transportPad2: atomic<u32>,\n};\n\nconst TERMINAL_SOURCE_KIND_EMISSIVE = 1u;\nconst TERMINAL_SOURCE_KIND_ENVIRONMENT = 2u;\nconst TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH = 3u;\nconst TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW = 4u;\nconst TERMINAL_SOURCE_KIND_ABSORPTION_NULL = 5u;\nconst TERMINAL_SOURCE_KIND_RUSSIAN_ROULETTE = 6u;\nconst TERMINAL_SOURCE_KIND_MAX_DEPTH_STRICT = 7u;\nconst TERMINAL_SOURCE_KIND_DETERMINISTIC_RESIDUAL_ZERO = 8u;\nconst TERMINATION_LUMINANCE_SCALE = 1000000.0;\nconst TRANSPORT_BUCKET_DIRECT_EXPLICIT = 1u;\nconst TRANSPORT_BUCKET_CACHED_INDIRECT = 2u;\nconst TRANSPORT_BUCKET_STOCHASTIC_RESIDUAL = 3u;\nconst TRANSPORT_EXPERIMENT_STABLE_SAMPLE_ROUTING = 1u;\nconst TRANSPORT_EXPERIMENT_STRICT_ZERO_OVERFLOW = 2u;\nconst TRANSPORT_EXPERIMENT_DEFER_LOW_SPP_RUSSIAN_ROULETTE = 4u;\nconst TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING = 8u;\nconst TRANSPORT_EXPERIMENT_PRODUCT_STUDIO_IMPORTANCE = 16u;\nconst TRANSPORT_EXPERIMENT_PRODUCT_TRANSPORT_TELEMETRY = 32u;\nconst TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING = 64u;\nconst TRANSPORT_EXPERIMENT_DETERMINISTIC_LOW_SPP_INDIRECT = 128u;\n\nstruct Counters {\n activeCount: atomic<u32>,\n nextCount: atomic<u32>,\n terminatedCount: atomic<u32>,\n hitCount: atomic<u32>,\n dispatchX: u32,\n dispatchY: u32,\n dispatchZ: u32,\n dispatchPad: u32,\n termination: TerminationMetrics,\n};\n\nstruct Candidate {\n hit: u32,\n distance: f32,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>,\n barycentric: vec3<f32>,\n uv: vec2<f32>,\n frontFace: u32,\n triangleIndex: u32,\n primitiveId: u32,\n materialRefId: u32,\n mediumRefId: u32,\n};\n\nstruct EnvironmentPortal {\n kind: u32,\n flags: u32,\n _pad0: u32,\n _pad1: u32,\n position: vec4<f32>,\n normal: vec4<f32>,\n tangent: vec4<f32>,\n bitangent: vec4<f32>,\n color: vec4<f32>,\n};\n\n@group(0) @binding(0) var<storage, read_write> activeQueue: array<RayRecord>;\n@group(0) @binding(1) var<storage, read_write> nextQueue: array<RayRecord>;\n@group(0) @binding(2) var<storage, read_write> hits: array<HitRecord>;\n@group(0) @binding(3) var<storage, read_write> accumulation: array<vec4<f32>>;\n@group(0) @binding(4) var<storage, read> sceneObjects: array<SceneObject>;\n@group(0) @binding(5) var<uniform> config: FrameConfig;\n@group(0) @binding(6) var<storage, read_write> counters: Counters;\n@group(0) @binding(7) var outputImage: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(8) var<storage, read_write> triangles: array<TriangleRecord>;\n@group(0) @binding(9) var<storage, read_write> bvhNodes: array<BvhNode>;\n@group(0) @binding(10) var<storage, read> meshVertices: array<MeshVertex>;\n@group(0) @binding(11) var<storage, read> meshIndices: array<u32>;\n@group(0) @binding(12) var<storage, read> meshRanges: array<MeshRange>;\n@group(0) @binding(13) var<storage, read_write> bvhLeafRefs: array<BvhLeafRef>;\n@group(0) @binding(14) var denoiseInputRadiance: texture_2d<f32>;\n@group(0) @binding(15) var denoisedRadianceImage: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(16) var radianceImage: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(17) var finalDenoiseInputRadiance: texture_2d<f32>;\n@group(0) @binding(18) var denoisedOutputImage: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(19) var<storage, read> environmentPortals: array<EnvironmentPortal>;\n@group(0) @binding(20) var environmentMapTexture: texture_2d<f32>;\n@group(0) @binding(21) var environmentMapSampler: sampler;\n@group(0) @binding(22) var<storage, read_write> pathVertices: array<vec4<f32>>;\n@group(0) @binding(23) var baseColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(24) var metallicRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(25) var normalAtlasTexture: texture_2d<f32>;\n@group(0) @binding(26) var occlusionAtlasTexture: texture_2d<f32>;\n@group(0) @binding(27) var emissiveAtlasTexture: texture_2d<f32>;\n@group(0) @binding(28) var materialAtlasSampler: sampler;\n@group(0) @binding(29) var brdfLutTexture: texture_2d<f32>;\n@group(0) @binding(30) var brdfLutSampler: sampler;\n@group(0) @binding(31) var environmentSamplingTexture: texture_2d<f32>;\n@group(0) @binding(32) var mediumTableTexture: texture_2d<f32>;\n@group(0) @binding(33) var clearcoatAtlasTexture: texture_2d<f32>;\n@group(0) @binding(34) var clearcoatRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(35) var clearcoatNormalAtlasTexture: texture_2d<f32>;\n@group(0) @binding(36) var transmissionAtlasTexture: texture_2d<f32>;\n@group(0) @binding(37) var thicknessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(38) var sheenColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(39) var sheenRoughnessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(40) var specularAtlasTexture: texture_2d<f32>;\n@group(0) @binding(41) var specularColorAtlasTexture: texture_2d<f32>;\n@group(0) @binding(42) var iridescenceAtlasTexture: texture_2d<f32>;\n@group(0) @binding(43) var iridescenceThicknessAtlasTexture: texture_2d<f32>;\n@group(0) @binding(44) var anisotropyAtlasTexture: texture_2d<f32>;\n\nfn hash_u32(value: u32) -> u32 {\n var x = value;\n x = ((x >> 16u) ^ x) * 0x45d9f3bu;\n x = ((x >> 16u) ^ x) * 0x45d9f3bu;\n x = (x >> 16u) ^ x;\n return x;\n}\n\nfn mix_seed(pixelId: u32, sampleId: u32, bounce: u32, frameIndex: u32, dimension: u32) -> u32 {\n var x =\n (pixelId * 747796405u) ^\n (sampleId * 2891336453u) ^\n (bounce * 277803737u) ^\n (frameIndex * 1442695041u) ^\n (dimension * 1597334677u);\n x = x ^ (x >> 16u);\n x = x * 0x7feb352du;\n x = x ^ (x >> 15u);\n x = x * 0x846ca68bu;\n x = x ^ (x >> 16u);\n return x;\n}\n\nfn random01(seed: u32) -> f32 {\n return f32(hash_u32(seed) & 0x00ffffffu) / 16777215.0;\n}\n\nfn transport_experiment_enabled(bit: u32) -> bool {\n return (config.transportExperimentFlags & bit) != 0u;\n}\n\nfn sample_frame_index(frameIndex: u32) -> u32 {\n return select(frameIndex, 0u, transport_experiment_enabled(TRANSPORT_EXPERIMENT_STABLE_SAMPLE_ROUTING));\n}\n\nfn radical_inverse_vdc(bits: u32) -> f32 {\n var value = bits;\n value = (value << 16u) | (value >> 16u);\n value = ((value & 0x55555555u) << 1u) | ((value & 0xaaaaaaaau) >> 1u);\n value = ((value & 0x33333333u) << 2u) | ((value & 0xccccccccu) >> 2u);\n value = ((value & 0x0f0f0f0fu) << 4u) | ((value & 0xf0f0f0f0u) >> 4u);\n value = ((value & 0x00ff00ffu) << 8u) | ((value & 0xff00ff00u) >> 8u);\n return f32(value) * 2.3283064365386963e-10;\n}\n\nfn sample_dimension_1d(\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n dimension: u32\n) -> f32 {\n return random01(mix_seed(pixelId, sampleId, bounce, sample_frame_index(frameIndex), dimension));\n}\n\nfn sample_dimension_2d(\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n dimension: u32,\n strataCount: u32\n) -> vec2<f32> {\n let strata = max(strataCount, 1u);\n let jitter = sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, dimension);\n let scramble = hash_u32(mix_seed(pixelId, sampleId, bounce, sample_frame_index(frameIndex), dimension));\n let stratified = fract((f32(sampleId % strata) + jitter) / f32(strata));\n let lowDiscrepancy = fract(radical_inverse_vdc(sampleId ^ scramble) + jitter);\n return vec2<f32>(stratified, lowDiscrepancy);\n}\n\nfn safe_normalize(value: vec3<f32>, fallback: vec3<f32>) -> vec3<f32> {\n let len = length(value);\n if (len <= 0.000001) {\n return fallback;\n }\n return value / len;\n}\n\nstruct TangentBasis {\n tangent: vec3<f32>,\n bitangent: vec3<f32>,\n};\n\nstruct SurfaceMaterialSample {\n color: vec4<f32>,\n emission: vec4<f32>,\n material: vec4<f32>,\n materialResponse: vec4<f32>,\n materialExtension: vec4<f32>,\n specularColor: vec4<f32>,\n shadingNormal: vec3<f32>,\n occlusion: f32,\n};\n`;\n","export const WAVEFRONT_SHADER_LIGHTING_WGSL = `\nfn environment_map_uv(direction: vec3<f32>) -> vec2<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let rotationTurns = config.environmentMapSettings.z / 6.28318530718;\n let u = fract(atan2(rayDirection.z, rayDirection.x) / 6.28318530718 + 0.5 + rotationTurns);\n let v = acos(clamp(rayDirection.y, -1.0, 1.0)) / 3.14159265359;\n return vec2<f32>(u, clamp(v, 0.0, 1.0));\n}\n\nfn environment_map_radiance(direction: vec3<f32>) -> vec3<f32> {\n let uv = environment_map_uv(direction);\n let texel = max(textureSampleLevel(environmentMapTexture, environmentMapSampler, uv, 0.0).rgb, vec3<f32>(0.0));\n return texel * max(config.environmentMapSettings.y, 0.0);\n}\n\nfn procedural_sky_radiance(direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let upFactor = saturate(rayDirection.y * 0.5 + 0.5);\n return (\n config.environmentHorizonColor.xyz * (1.0 - upFactor) +\n config.environmentZenithColor.xyz * upFactor\n ) * max(config.environmentSunDirectionIntensity.w, 0.0001);\n}\n\nfn procedural_environment_radiance(direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let sunDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let sunGlow = pow(saturate(dot(rayDirection, sunDirection)), 192.0);\n return (\n procedural_sky_radiance(rayDirection) +\n config.environmentSunColor.xyz * sunGlow * max(config.environmentSunDirectionIntensity.w, 0.0001)\n );\n}\n\nfn base_environment_radiance(direction: vec3<f32>) -> vec3<f32> {\n if (environment_map_enabled()) {\n return environment_map_radiance(direction);\n }\n return procedural_environment_radiance(direction);\n}\n\nfn environment_portal_radiance_scale(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return vec3<f32>(1.0);\n }\n var scale = vec3<f32>(0.0);\n for (var portalIndex = 0u; portalIndex < config.environmentPortalCount; portalIndex = portalIndex + 1u) {\n let portal = environmentPortals[portalIndex];\n if (portal.kind == 1u) {\n let portalNormal = safe_normalize(portal.normal.xyz, vec3<f32>(0.0, 0.0, 1.0));\n let denominator = dot(direction, portalNormal);\n let twoSided = (portal.flags & 1u) != 0u;\n var facing = abs(denominator) > 0.0001;\n if (!twoSided && denominator <= 0.0001) {\n facing = false;\n }\n if (facing) {\n let distance = dot(portal.position.xyz - origin, portalNormal) / denominator;\n if (distance > 0.001) {\n let hitPosition = origin + direction * distance;\n let local = hitPosition - portal.position.xyz;\n let tangent = safe_normalize(portal.tangent.xyz, vec3<f32>(1.0, 0.0, 0.0));\n let bitangent = safe_normalize(portal.bitangent.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let u = dot(local, tangent);\n let v = dot(local, bitangent);\n if (abs(u) <= portal.tangent.w && abs(v) <= portal.bitangent.w) {\n let areaWeight = clamp(sqrt(max(portal.position.w, 0.0001)), 0.25, 4.0);\n let angleWeight = max(abs(denominator), 0.08);\n let portalScale = portal.color.rgb * portal.normal.w * portal.color.a * areaWeight * angleWeight;\n scale = max(scale, portalScale);\n }\n }\n }\n }\n }\n return scale;\n}\n\nfn environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let portalScale = environment_portal_radiance_scale(origin, rayDirection);\n let portalHit = max_component(portalScale) > 0.0001;\n return base_environment_radiance(rayDirection) *\n select(vec3<f32>(1.0), portalScale, portalHit);\n}\n\nfn direct_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let portalScale = environment_portal_radiance_scale(origin, rayDirection);\n let portalHit = max_component(portalScale) > 0.0001;\n if (\n config.environmentPortalCount > 0u &&\n config.environmentPortalMode == 2u &&\n !portalHit\n ) {\n return vec3<f32>(0.0);\n }\n return base_environment_radiance(rayDirection) *\n select(vec3<f32>(1.0), portalScale, portalHit);\n}\n\nfn hammersley_2d(index: u32, count: u32) -> vec2<f32> {\n return vec2<f32>(f32(index) / max(f32(count), 1.0), radical_inverse_vdc(index));\n}\n\nfn build_basis_tangent(normal: vec3<f32>) -> vec3<f32> {\n let tangentFallback = select(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(1.0, 0.0, 0.0), abs(normal.y) >= 0.999);\n return safe_normalize(cross(tangentFallback, normal), vec3<f32>(1.0, 0.0, 0.0));\n}\n\nfn local_to_world(local: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n let tangent = build_basis_tangent(normal);\n let bitangent = safe_normalize(cross(normal, tangent), vec3<f32>(0.0, 0.0, 1.0));\n return safe_normalize(tangent * local.x + bitangent * local.y + normal * local.z, normal);\n}\n\nfn cosine_sample_hemisphere(sample: vec2<f32>, normal: vec3<f32>) -> vec3<f32> {\n let phi = 6.28318530718 * sample.x;\n let radius = sqrt(sample.y);\n let x = cos(phi) * radius;\n let y = sin(phi) * radius;\n let z = sqrt(max(0.0, 1.0 - sample.y));\n return local_to_world(vec3<f32>(x, y, z), normal);\n}\n\nfn importance_sample_ggx(sample: vec2<f32>, roughness: f32, normal: vec3<f32>) -> vec3<f32> {\n let alpha = max(roughness * roughness, 0.0001);\n let phi = 6.28318530718 * sample.x;\n let cosTheta = sqrt((1.0 - sample.y) / max(1.0 + (alpha * alpha - 1.0) * sample.y, 0.0001));\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let localHalf = vec3<f32>(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);\n return local_to_world(localHalf, normal);\n}\n\nfn distribution_ggx(normal: vec3<f32>, halfVector: vec3<f32>, roughness: f32) -> f32 {\n let alpha = max(roughness * roughness, 0.0001);\n let alpha2 = alpha * alpha;\n let nDotH = saturate(dot(normal, halfVector));\n let denominator = nDotH * nDotH * (alpha2 - 1.0) + 1.0;\n return alpha2 / max(3.14159265359 * denominator * denominator, 0.000001);\n}\n\nfn geometry_schlick_ggx(nDotValue: f32, roughness: f32) -> f32 {\n let k = ((roughness + 1.0) * (roughness + 1.0)) / 8.0;\n return nDotValue / max(nDotValue * (1.0 - k) + k, 0.000001);\n}\n\nfn geometry_smith(normal: vec3<f32>, viewDirection: vec3<f32>, lightDirection: vec3<f32>, roughness: f32) -> f32 {\n let nDotV = saturate(dot(normal, viewDirection));\n let nDotL = saturate(dot(normal, lightDirection));\n return geometry_schlick_ggx(nDotV, roughness) * geometry_schlick_ggx(nDotL, roughness);\n}\n\nfn fresnel_schlick(cosine: f32, f0: vec3<f32>) -> vec3<f32> {\n return f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - cosine, 5.0);\n}\n\nfn sample_brdf_lut(nDotV: f32, roughness: f32) -> vec2<f32> {\n let uv = vec2<f32>(clamp(nDotV, 0.0, 1.0), clamp(roughness, 0.0, 1.0));\n return textureSampleLevel(brdfLutTexture, brdfLutSampler, uv, 0.0).xy;\n}\n\nfn prefiltered_environment_radiance(direction: vec3<f32>, roughness: f32) -> vec3<f32> {\n let uv = environment_map_uv(direction);\n let maxLevel = max(config.environmentMapMeta.z - 1.0, 0.0);\n let lod = clamp(roughness, 0.0, 1.0) * maxLevel;\n let texel = max(textureSampleLevel(environmentMapTexture, environmentMapSampler, uv, lod).rgb, vec3<f32>(0.0));\n return texel * max(config.environmentMapSettings.y, 0.0);\n}\n\nfn environment_pdf_dimensions() -> vec2<u32> {\n return vec2<u32>(\n max(u32(config.environmentMapMeta.x), 1u),\n max(u32(config.environmentMapMeta.y), 1u)\n );\n}\n\nfn environment_importance_sampling_enabled() -> bool {\n return config.environmentMapMeta.w > 0.5;\n}\n\nfn uniform_sphere_pdf() -> f32 {\n return 1.0 / (4.0 * 3.14159265359);\n}\n\nfn uniform_hemisphere_pdf() -> f32 {\n return 1.0 / (2.0 * 3.14159265359);\n}\n\nfn cosine_hemisphere_pdf(normal: vec3<f32>, direction: vec3<f32>) -> f32 {\n return saturate(dot(normal, direction)) / 3.14159265359;\n}\n\nfn sample_uniform_sphere_direction(sample: vec2<f32>) -> vec3<f32> {\n let z = 1.0 - 2.0 * sample.y;\n let radial = sqrt(max(1.0 - z * z, 0.0));\n let phi = sample.x * 6.28318530718;\n return vec3<f32>(cos(phi) * radial, z, sin(phi) * radial);\n}\n\nfn sample_uniform_hemisphere_direction(sample: vec2<f32>, normal: vec3<f32>) -> vec3<f32> {\n let z = sample.y;\n let radial = sqrt(max(1.0 - z * z, 0.0));\n let phi = sample.x * 6.28318530718;\n return local_to_world(vec3<f32>(cos(phi) * radial, sin(phi) * radial, z), normal);\n}\n\nfn environment_sampling_texel(x: u32, y: u32) -> vec4<f32> {\n return textureLoad(environmentSamplingTexture, vec2<i32>(i32(x), i32(y)), 0);\n}\n\nfn environment_pdf_texel(x: u32, y: u32) -> f32 {\n return environment_sampling_texel(x, y).x;\n}\n\nfn environment_row_cdf_texel(y: u32) -> f32 {\n return environment_sampling_texel(0u, y).z;\n}\n\nfn environment_column_cdf_texel(x: u32, y: u32) -> f32 {\n return environment_sampling_texel(x, y).y;\n}\n\nfn environment_direction_pdf(direction: vec3<f32>) -> f32 {\n if (!environment_importance_sampling_enabled()) {\n return uniform_sphere_pdf();\n }\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let uv = environment_map_uv(rayDirection);\n let dimensions = environment_pdf_dimensions();\n let width = max(f32(dimensions.x), 1.0);\n let height = max(f32(dimensions.y), 1.0);\n let x = min(u32(uv.x * width), dimensions.x - 1u);\n let y = min(u32(uv.y * height), dimensions.y - 1u);\n let discretePdf = max(environment_pdf_texel(x, y), 0.0);\n let sinTheta = sqrt(max(1.0 - rayDirection.y * rayDirection.y, 0.0));\n let solidAngle = max((2.0 * 3.14159265359 * 3.14159265359 * sinTheta) / (width * height), 0.000001);\n return discretePdf / solidAngle;\n}\n\nfn sample_row_cdf(count: u32, sampleValue: f32) -> u32 {\n if (count == 0u) {\n return 0u;\n }\n var low = 0u;\n var high = count - 1u;\n loop {\n if (low >= high) {\n break;\n }\n let mid = (low + high) / 2u;\n let cdfValue = environment_row_cdf_texel(mid);\n if (sampleValue <= cdfValue) {\n high = mid;\n } else {\n low = mid + 1u;\n }\n }\n return min(low, count - 1u);\n}\n\nfn sample_column_cdf(row: u32, count: u32, sampleValue: f32) -> u32 {\n if (count == 0u) {\n return 0u;\n }\n var low = 0u;\n var high = count - 1u;\n loop {\n if (low >= high) {\n break;\n }\n let mid = (low + high) / 2u;\n let cdfValue = environment_column_cdf_texel(mid, row);\n if (sampleValue <= cdfValue) {\n high = mid;\n } else {\n low = mid + 1u;\n }\n }\n return min(low, count - 1u);\n}\n\nstruct EnvironmentSample {\n direction: vec3<f32>,\n radiance: vec3<f32>,\n pdf: f32,\n};\n\nstruct DirectLightSample {\n direction: vec4<f32>,\n radiance: vec4<f32>,\n pdf: f32,\n maxDistance: f32,\n flags: u32,\n valid: u32,\n};\n\nfn sample_environment_importance(sample: vec2<f32>) -> EnvironmentSample {\n if (!environment_importance_sampling_enabled()) {\n let direction = sample_uniform_sphere_direction(sample);\n return EnvironmentSample(direction, base_environment_radiance(direction), uniform_sphere_pdf());\n }\n let dimensions = environment_pdf_dimensions();\n let row = sample_row_cdf(dimensions.y, sample.y);\n let column = sample_column_cdf(row, dimensions.x, sample.x);\n let uv = vec2<f32>(\n (f32(column) + 0.5) / max(f32(dimensions.x), 1.0),\n (f32(row) + 0.5) / max(f32(dimensions.y), 1.0)\n );\n let theta = uv.y * 3.14159265359;\n let phi = (uv.x - 0.5 - config.environmentMapSettings.z / 6.28318530718) * 6.28318530718;\n let sinTheta = sin(theta);\n let direction = vec3<f32>(cos(phi) * sinTheta, cos(theta), sin(phi) * sinTheta);\n let pdf = environment_direction_pdf(direction);\n return EnvironmentSample(direction, base_environment_radiance(direction), pdf);\n}\n\nfn triangle_surface_normal(triangle: TriangleRecord) -> vec3<f32> {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n return safe_normalize(cross(edge1, edge2), vec3<f32>(0.0, 1.0, 0.0));\n}\n\nfn triangle_surface_area(triangle: TriangleRecord) -> f32 {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n return max(length(cross(edge1, edge2)) * 0.5, 0.000001);\n}\n\nfn solid_angle_pdf_from_area_pdf(\n areaPdf: f32,\n shadingPoint: vec3<f32>,\n lightPoint: vec3<f32>,\n lightNormal: vec3<f32>\n) -> f32 {\n let offset = lightPoint - shadingPoint;\n let distanceSquared = max(dot(offset, offset), 0.000001);\n let lightDirection = safe_normalize(offset, lightNormal);\n let geometry = max(dot(lightNormal, -lightDirection), 0.0);\n if (geometry <= 0.000001) {\n return 0.0;\n }\n return areaPdf * distanceSquared / max(geometry, 0.000001);\n}\n\nfn power_heuristic(pdfA: f32, pdfB: f32) -> f32 {\n let a2 = pdfA * pdfA;\n let b2 = pdfB * pdfB;\n return a2 / max(a2 + b2, 0.000001);\n}\n\nfn visible_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n let visible = !scene_visibility_blocked(origin, rayDirection, 1000000.0);\n return select(vec3<f32>(0.0), direct_environment_radiance(origin, rayDirection), visible);\n}\n\nfn glossy_environment_direction(\n incidentDirection: vec3<f32>,\n normal: vec3<f32>,\n roughness: f32,\n normalBlendScale: f32\n) -> vec3<f32> {\n let reflectionDirection = reflect(incidentDirection, normal);\n let blend = clamp(roughness * roughness * normalBlendScale, 0.0, 0.92);\n return safe_normalize(mix(reflectionDirection, normal, blend), normal);\n}\n\nfn surface_glossiness(hit: HitRecord) -> f32 {\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let sheen = clamp(max_component(hit.materialResponse.xyz), 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let baseGloss =\n max(\n clearcoat,\n max(sheen * 0.72, max(specularWeight * (0.38 + metallic * 0.62), transmission))\n );\n return clamp(baseGloss * (1.0 - roughness * 0.72) + metallic * (1.0 - roughness) * 0.35, 0.0, 1.0);\n}\n\nfn surface_specular_f0(hit: HitRecord, surfaceColor: vec3<f32>) -> vec3<f32> {\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let specularColor = clamp(hit.specularColor.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let dielectricF0 = vec3<f32>(0.04) * specularWeight * specularColor;\n return mix(dielectricF0, surfaceColor, metallic);\n}\n\nfn surface_bsdf_sampling_weights(hit: HitRecord) -> vec3<f32> {\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let specularWeight = clamp(hit.materialExtension.y, 0.0, 1.0);\n let diffuseWeight = clamp(\n (1.0 - metallic) * max(1.0 - specularWeight * 0.5 - clearcoat * 0.25, 0.15),\n 0.0,\n 1.0\n );\n let specWeight = clamp(max(metallic, specularWeight * 0.75) * (1.0 - clearcoat * 0.5), 0.0, 1.0);\n let clearcoatWeight = clamp(clearcoat, 0.0, 1.0);\n let totalWeight = max(diffuseWeight + specWeight + clearcoatWeight, 0.000001);\n return vec3<f32>(\n diffuseWeight / totalWeight,\n specWeight / totalWeight,\n clearcoatWeight / totalWeight\n );\n}\n\nfn evaluate_surface_bsdf(hit: HitRecord, viewDirection: vec3<f32>, lightDirection: vec3<f32>) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let surfaceColor = clamp(max(hit.color.xyz, config.ambientColor.xyz * 0.35), vec3<f32>(0.0), vec3<f32>(1.0));\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let metallic = clamp(hit.material.y, 0.0, 1.0);\n let clearcoat = clamp(hit.materialResponse.w, 0.0, 1.0);\n let clearcoatRoughness = clamp(hit.materialExtension.x, 0.0, 1.0);\n let occlusion = clamp(hit.occlusion, 0.0, 1.0);\n let nDotV = saturate(dot(normal, viewDirection));\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotV <= 0.0 || nDotL <= 0.0) {\n return vec3<f32>(0.0);\n }\n let halfVector = safe_normalize(viewDirection + lightDirection, normal);\n let vDotH = saturate(dot(viewDirection, halfVector));\n let f0 = surface_specular_f0(hit, surfaceColor);\n let fresnel = fresnel_schlick(vDotH, f0);\n let distribution = distribution_ggx(normal, halfVector, roughness);\n let geometry = geometry_smith(normal, viewDirection, lightDirection, roughness);\n let specular = (distribution * geometry * fresnel) / max(4.0 * nDotV * nDotL, 0.000001);\n let diffuseWeight = (1.0 - metallic) * (1.0 - clearcoat * 0.24) * (1.0 - clamp(max_component(fresnel), 0.0, 0.98));\n let diffuse = surfaceColor * diffuseWeight / 3.14159265359;\n let clearcoatHalf = safe_normalize(viewDirection + lightDirection, normal);\n let clearcoatDistribution = distribution_ggx(normal, clearcoatHalf, max(clearcoatRoughness, 0.02));\n let clearcoatGeometry = geometry_smith(normal, viewDirection, lightDirection, max(clearcoatRoughness, 0.02));\n let clearcoatFresnel = fresnel_schlick(saturate(dot(viewDirection, clearcoatHalf)), vec3<f32>(0.04));\n let clearcoatTerm =\n (clearcoatDistribution * clearcoatGeometry * clearcoatFresnel) /\n max(4.0 * nDotV * nDotL, 0.000001) *\n clearcoat;\n return (diffuse + specular + clearcoatTerm) * mix(0.42, 1.0, occlusion);\n}\n\nfn diffuse_pdf(normal: vec3<f32>, lightDirection: vec3<f32>) -> f32 {\n return saturate(dot(normal, lightDirection)) / 3.14159265359;\n}\n\nfn ggx_pdf(normal: vec3<f32>, viewDirection: vec3<f32>, lightDirection: vec3<f32>, roughness: f32) -> f32 {\n let halfVector = safe_normalize(viewDirection + lightDirection, normal);\n let nDotH = saturate(dot(normal, halfVector));\n let vDotH = saturate(dot(viewDirection, halfVector));\n let distribution = distribution_ggx(normal, halfVector, roughness);\n return (distribution * nDotH) / max(4.0 * vDotH, 0.000001);\n}\n\nfn evaluate_surface_bsdf_pdf(hit: HitRecord, viewDirection: vec3<f32>, lightDirection: vec3<f32>) -> f32 {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let weights = surface_bsdf_sampling_weights(hit);\n let diffuseTerm = diffuse_pdf(normal, lightDirection);\n let specTerm = ggx_pdf(normal, viewDirection, lightDirection, max(roughness, 0.02));\n let clearcoatTerm = ggx_pdf(normal, viewDirection, lightDirection, max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02));\n return weights.x * diffuseTerm + weights.y * specTerm + weights.z * clearcoatTerm;\n}\n\nfn gated_environment_radiance(origin: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {\n let portalScale = environment_portal_radiance_scale(origin, safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0)));\n if (\n config.environmentPortalCount > 0u &&\n config.environmentPortalMode == 2u &&\n max_component(portalScale) <= 0.0001\n ) {\n return config.ambientColor.xyz * 0.65;\n }\n return environment_radiance(origin, direction);\n}\n\nfn medium_dimensions() -> vec2<u32> {\n return textureDimensions(mediumTableTexture);\n}\n\nfn medium_valid(mediumRefId: u32) -> bool {\n let dimensions = medium_dimensions();\n return mediumRefId > 0u && mediumRefId < dimensions.x;\n}\n\nfn medium_absorption(mediumRefId: u32) -> vec3<f32> {\n if (!medium_valid(mediumRefId)) {\n return vec3<f32>(0.0);\n }\n return max(\n textureLoad(mediumTableTexture, vec2<i32>(i32(mediumRefId), 0), 0).xyz,\n vec3<f32>(0.0)\n );\n}\n\nfn medium_scattering(mediumRefId: u32) -> vec3<f32> {\n if (!medium_valid(mediumRefId)) {\n return vec3<f32>(0.0);\n }\n return max(\n textureLoad(mediumTableTexture, vec2<i32>(i32(mediumRefId), 1), 0).xyz,\n vec3<f32>(0.0)\n );\n}\n\nfn medium_transmittance(mediumRefId: u32, distance: f32) -> vec3<f32> {\n if (!medium_valid(mediumRefId) || distance <= 0.000001) {\n return vec3<f32>(1.0);\n }\n let extinction = medium_absorption(mediumRefId) + medium_scattering(mediumRefId);\n return vec3<f32>(\n exp(-extinction.x * distance),\n exp(-extinction.y * distance),\n exp(-extinction.z * distance)\n );\n}\n\nconst MAX_MEDIUM_STACK_DEPTH: u32 = 4u;\n\nfn medium_stack_current_id(ray: RayRecord) -> u32 {\n if (ray.mediumStackDepth == 0u) {\n return ray.mediumRefId;\n }\n if (ray.mediumStackDepth == 1u) {\n return ray.mediumStack.x;\n }\n if (ray.mediumStackDepth == 2u) {\n return ray.mediumStack.y;\n }\n if (ray.mediumStackDepth == 3u) {\n return ray.mediumStack.z;\n }\n return ray.mediumStack.w;\n}\n\nfn transitioned_medium_stack(ray: RayRecord, hit: HitRecord) -> vec4<u32> {\n var stack = ray.mediumStack;\n var depth = min(ray.mediumStackDepth, MAX_MEDIUM_STACK_DEPTH);\n let mediumId = hit.mediumRefId;\n if (!medium_valid(mediumId)) {\n return stack;\n }\n if (hit.frontFace == 1u) {\n if (depth == 0u) {\n stack.x = mediumId;\n } else if (depth == 1u) {\n stack.y = mediumId;\n } else if (depth == 2u) {\n stack.z = mediumId;\n } else if (depth == 3u) {\n stack.w = mediumId;\n } else {\n stack = vec4<u32>(stack.y, stack.z, stack.w, mediumId);\n }\n return stack;\n }\n if (depth == 4u && stack.w == mediumId) {\n return vec4<u32>(stack.x, stack.y, stack.z, 0u);\n }\n if (depth >= 3u && stack.z == mediumId) {\n return vec4<u32>(stack.x, stack.y, stack.w, 0u);\n }\n if (depth >= 2u && stack.y == mediumId) {\n return vec4<u32>(stack.x, stack.z, stack.w, 0u);\n }\n if (depth >= 1u && stack.x == mediumId) {\n return vec4<u32>(stack.y, stack.z, stack.w, 0u);\n }\n return stack;\n}\n\nfn transitioned_medium_stack_depth(ray: RayRecord, hit: HitRecord) -> u32 {\n let stack = transitioned_medium_stack(ray, hit);\n if (stack.w != 0u) {\n return 4u;\n }\n if (stack.z != 0u) {\n return 3u;\n }\n if (stack.y != 0u) {\n return 2u;\n }\n if (stack.x != 0u) {\n return 1u;\n }\n return 0u;\n}\n\nfn transmitted_medium_ref_id(ray: RayRecord, hit: HitRecord) -> u32 {\n if (!medium_valid(hit.mediumRefId)) {\n return medium_stack_current_id(ray);\n }\n let stack = transitioned_medium_stack(ray, hit);\n if (stack.w != 0u) {\n return stack.w;\n }\n if (stack.z != 0u) {\n return stack.z;\n }\n if (stack.y != 0u) {\n return stack.y;\n }\n if (stack.x != 0u) {\n return stack.x;\n }\n return 0u;\n}\n\nfn surface_delta_reflection_throughput(hit: HitRecord, viewDirection: vec3<f32>) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let surfaceColor = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let fresnel = fresnel_schlick(saturate(dot(normal, viewDirection)), surface_specular_f0(hit, surfaceColor));\n return sanitize_path_throughput(fresnel);\n}\n\nfn surface_delta_transmission_throughput(hit: HitRecord, viewDirection: vec3<f32>) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let surfaceColor = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let transmission = clamp(hit.materialExtension.z, 0.0, 1.0);\n let fresnel = fresnel_schlick(saturate(dot(normal, viewDirection)), surface_specular_f0(hit, surfaceColor));\n let transmissionTint = mix(vec3<f32>(1.0), surfaceColor, transmission);\n return sanitize_path_throughput(max(vec3<f32>(1.0) - fresnel, vec3<f32>(0.0)) * transmissionTint);\n}\n\nfn surface_continuation_throughput(\n hit: HitRecord,\n viewDirection: vec3<f32>,\n lightDirection: vec3<f32>,\n scatter: ScatterResult\n) -> vec3<f32> {\n if ((scatter.flags & RAY_FLAG_DELTA_SAMPLE) != 0u) {\n if (scatter.lobeKind == SCATTER_LOBE_DELTA_TRANSMISSION) {\n return surface_delta_transmission_throughput(hit, viewDirection);\n }\n return surface_delta_reflection_throughput(hit, viewDirection);\n }\n if (scatter.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let normal = surface_shading_normal(hit);\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n let nDotL = saturate(dot(normal, lightDirection));\n return sanitize_path_throughput(bsdf * (nDotL / scatter.pdf));\n}\n\nfn sunlit_baseline_radiance(normal: vec3<f32>) -> vec3<f32> {\n let baseline = max(config.pathResolveSettings.y, 0.0);\n if (baseline <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let sunDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let sunFacing = saturate(dot(normal, sunDirection));\n let skyFacing = 0.35 + saturate(normal.y * 0.5 + 0.5) * 0.65;\n let directionalWeight = 0.38 + sunFacing * 0.62;\n let sunTint = max(config.environmentSunColor.xyz, vec3<f32>(0.0));\n return sanitize_linear_radiance(sunTint * baseline * skyFacing * directionalWeight * 0.04);\n}\n\nfn terminal_surface_environment_source(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, normal);\n let roughness = clamp(hit.material.x, 0.0, 1.0);\n let glossiness = surface_glossiness(hit);\n let normalEnvironment = gated_environment_radiance(origin, normal);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let reflectionDirection = glossy_environment_direction(\n ray.direction.xyz,\n normal,\n roughness,\n mix(0.88, 0.38, glossiness)\n );\n let reflectionEnvironment = prefiltered_environment_radiance(reflectionDirection, roughness);\n let surfaceColor = clamp(max(hit.color.xyz, config.ambientColor.xyz * 0.35), vec3<f32>(0.0), vec3<f32>(1.0));\n let f0 = surface_specular_f0(hit, surfaceColor);\n let brdfTerm = sample_brdf_lut(saturate(dot(normal, viewDirection)), roughness);\n let specularEnvironment = reflectionEnvironment * (f0 * brdfTerm.x + vec3<f32>(brdfTerm.y));\n let sunlitFloor = sunlit_baseline_radiance(normal);\n let ambientFloor = select(\n max(config.ambientColor.xyz, sunlitFloor * 0.82),\n max(config.ambientColor.xyz * 0.35, sunlitFloor * 0.58),\n environment_map_enabled()\n );\n let environmentInfluence = select(\n max(0.12, config.pathResolveSettings.y * 0.42),\n max(config.environmentMapSettings.w, max(0.12, config.pathResolveSettings.y * 0.42)),\n environment_map_enabled()\n );\n let glossyEnvironment = max(\n normalEnvironment,\n max(reflectionEnvironment * mix(0.24, 0.92, glossiness), specularEnvironment)\n );\n let environmentFloor = max(ambientFloor, max(sunlitFloor, glossyEnvironment * environmentInfluence));\n let materialFloor = select(0.7, 1.0, hit.materialKind == 0u || hit.materialKind == 3u);\n return sanitize_linear_radiance(environmentFloor * materialFloor);\n}\n\nfn terminal_surface_environment_contribution(\n ray: RayRecord,\n throughput: vec3<f32>,\n hit: HitRecord\n) -> vec3<f32> {\n let surfaceColor = max(hit.color.xyz, config.ambientColor.xyz);\n let occlusion = mix(0.75, 1.0, clamp(hit.occlusion, 0.0, 1.0));\n return sanitize_linear_radiance(\n throughput *\n surfaceColor *\n terminal_surface_environment_source(ray, hit) *\n occlusion\n );\n}\n\nfn direct_environment_portal_irradiance(origin: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return vec3<f32>(0.0);\n }\n\n var irradiance = vec3<f32>(0.0);\n for (var portalIndex = 0u; portalIndex < config.environmentPortalCount; portalIndex = portalIndex + 1u) {\n let portal = environmentPortals[portalIndex];\n if (portal.kind != 1u) {\n continue;\n }\n\n let toPortal = portal.position.xyz - origin;\n let distanceSquared = max(dot(toPortal, toPortal), 0.01);\n let direction = safe_normalize(toPortal, normal);\n let surfaceFacing = saturate(dot(normal, direction));\n if (surfaceFacing <= 0.0001) {\n continue;\n }\n\n let portalNormal = safe_normalize(portal.normal.xyz, vec3<f32>(0.0, 0.0, 1.0));\n let twoSided = (portal.flags & 1u) != 0u;\n let portalFacing = select(\n saturate(dot(-direction, portalNormal)),\n max(abs(dot(direction, portalNormal)), 0.15),\n twoSided\n );\n let area = max(portal.position.w, 0.0001);\n let distanceFalloff = clamp(area / max(distanceSquared, area * 0.25), 0.0, 2.5);\n let traceDistance = max(sqrt(distanceSquared) - 0.01, 0.01);\n if (scene_visibility_blocked(origin, direction, traceDistance)) {\n continue;\n }\n irradiance = irradiance +\n portal.color.rgb *\n portal.normal.w *\n portal.color.a *\n surfaceFacing *\n portalFacing *\n distanceFalloff;\n }\n return irradiance;\n}\n\nfn visibility_test_ray(origin: vec3<f32>, direction: vec3<f32>) -> RayRecord {\n let rayDirection = safe_normalize(direction, vec3<f32>(0.0, 1.0, 0.0));\n return RayRecord(\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n 0u,\n vec4<f32>(origin, 1.0),\n vec4<f32>(rayDirection, 0.0),\n vec4<f32>(1.0, 1.0, 1.0, 1.0),\n vec4<u32>(0u)\n );\n}\n\nfn scene_visibility_blocked(origin: vec3<f32>, direction: vec3<f32>, maxDistance: f32) -> bool {\n let testRay = visibility_test_ray(origin, direction);\n let nearest = max(maxDistance, 0.001);\n\n for (var objectIndex = 0u; objectIndex < config.sceneObjectCount; objectIndex = objectIndex + 1u) {\n let object = sceneObjects[objectIndex];\n var current = no_candidate();\n if (object.kind == 1u) {\n current = intersect_sphere(testRay, object);\n } else if (object.kind == 2u) {\n current = intersect_box(testRay, object);\n }\n if (current.hit == 1u && current.distance < nearest) {\n return true;\n }\n }\n\n let meshCandidate = intersect_bvh(testRay, nearest);\n return meshCandidate.hit == 1u && meshCandidate.distance < nearest;\n}\n\nfn sample_emissive_triangle_light(\n hit: HitRecord,\n pixelId: u32,\n sampleId: u32,\n bounce: u32,\n frameIndex: u32,\n selectionDimension: u32,\n surfaceDimension: u32\n) -> DirectLightSample {\n if (config.emissiveTriangleCount == 0u) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n let selector =\n sample_dimension_1d(pixelId, sampleId, bounce, frameIndex, selectionDimension);\n var lightSlot = min(\n u32(selector * f32(config.emissiveTriangleCount)),\n config.emissiveTriangleCount - 1u\n );\n if (strict_physical_low_spp_lighting_enabled()) {\n let firstMetadata = bvhNodes[config.bvhNodeCapacity];\n let totalWeight = max(firstMetadata.boundsMin.z, 0.0);\n if (totalWeight > 0.000001) {\n let targetWeight = selector * totalWeight;\n for (var candidateSlot = 0u; candidateSlot < config.emissiveTriangleCount; candidateSlot = candidateSlot + 1u) {\n let candidateMetadata = bvhNodes[config.bvhNodeCapacity + candidateSlot];\n if (targetWeight <= candidateMetadata.boundsMin.x) {\n lightSlot = candidateSlot;\n break;\n }\n }\n }\n }\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let triangleIndex = lightMetadata.childOrFirst;\n if (triangleIndex >= config.triangleCount) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n\n let lightTriangle = triangles[triangleIndex];\n let triangleArea = triangle_surface_area(lightTriangle);\n let lightNormal = triangle_surface_normal(lightTriangle);\n let sampleUv = sample_dimension_2d(\n pixelId,\n sampleId,\n bounce,\n frameIndex,\n surfaceDimension,\n config.samplesPerPixel\n );\n let root = sqrt(sampleUv.x);\n let b0 = 1.0 - root;\n let b1 = root * (1.0 - sampleUv.y);\n let b2 = root * sampleUv.y;\n let lightPoint =\n lightTriangle.v0.xyz * b0 +\n lightTriangle.v1.xyz * b1 +\n lightTriangle.v2.xyz * b2;\n let lightDirection = safe_normalize(lightPoint - hit.position.xyz, lightNormal);\n let traceDistance = max(distance(lightPoint, hit.position.xyz) - 0.01, 0.01);\n var selectionProbability = 1.0 / max(f32(config.emissiveTriangleCount), 1.0);\n if (strict_physical_low_spp_lighting_enabled()) {\n let totalWeight = max(lightMetadata.boundsMin.z, 0.0);\n let triangleWeight = max(lightMetadata.boundsMin.y, 0.0);\n if (totalWeight > 0.000001 && triangleWeight > 0.000001) {\n selectionProbability = triangleWeight / totalWeight;\n }\n }\n let areaPdf = selectionProbability / max(triangleArea, 0.000001);\n let lightPdf = solid_angle_pdf_from_area_pdf(areaPdf, hit.position.xyz, lightPoint, lightNormal);\n if (lightPdf <= 0.000001) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n let radiance = max(lightTriangle.emission.xyz, lightTriangle.color.xyz);\n if (max_component(radiance) <= 0.000001) {\n return DirectLightSample(vec4<f32>(0.0), vec4<f32>(0.0), 0.0, 0.0, 0u, 0u);\n }\n return DirectLightSample(vec4<f32>(lightDirection, 0.0), vec4<f32>(radiance, 0.0), lightPdf, traceDistance, 0u, 1u);\n}\n\nfn emissive_direct_class_probability() -> f32 {\n if (config.emissiveTriangleCount == 0u) {\n return 0.0;\n }\n if (\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING) ||\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n ) {\n return 1.0;\n }\n return select(1.0, 0.5, config.emissiveTriangleCount > 0u);\n}\n\nfn terminal_emissive_light_pdf(ray: RayRecord, hit: HitRecord) -> f32 {\n if (config.emissiveTriangleCount == 0u) {\n return 0.0;\n }\n\n var lightSlot = 0xffffffffu;\n var triangleIndex = 0xffffffffu;\n for (var candidateSlot = 0u; candidateSlot < config.emissiveTriangleCount; candidateSlot = candidateSlot + 1u) {\n let candidateMetadata = bvhNodes[config.bvhNodeCapacity + candidateSlot];\n let candidateTriangleIndex = candidateMetadata.childOrFirst;\n if (candidateTriangleIndex >= config.triangleCount) {\n continue;\n }\n let candidateTriangle = triangles[candidateTriangleIndex];\n if (candidateTriangle.triangleId == hit.primitiveId) {\n lightSlot = candidateSlot;\n triangleIndex = candidateTriangleIndex;\n break;\n }\n }\n\n if (lightSlot == 0xffffffffu || triangleIndex == 0xffffffffu) {\n return 0.0;\n }\n\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let lightTriangle = triangles[triangleIndex];\n let triangleArea = triangle_surface_area(lightTriangle);\n let lightNormal = triangle_surface_normal(lightTriangle);\n var selectionProbability =\n emissive_direct_class_probability() /\n max(f32(config.emissiveTriangleCount), 1.0);\n if (strict_physical_low_spp_lighting_enabled()) {\n let totalWeight = max(lightMetadata.boundsMin.z, 0.0);\n let triangleWeight = max(lightMetadata.boundsMin.y, 0.0);\n if (totalWeight > 0.000001 && triangleWeight > 0.000001) {\n selectionProbability = emissive_direct_class_probability() * triangleWeight / totalWeight;\n }\n }\n\n let areaPdf = selectionProbability / max(triangleArea, 0.000001);\n return solid_angle_pdf_from_area_pdf(\n areaPdf,\n ray.origin.xyz,\n hit.position.xyz,\n lightNormal\n );\n}\n\nfn direct_light_sample_frame_index() -> u32 {\n return select(\n config.frameIndex,\n 0u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING) ||\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n );\n}\n\nfn direct_light_sample_pixel_id(ray: RayRecord) -> u32 {\n return select(\n ray.sourcePixelId,\n 0u,\n transport_experiment_enabled(TRANSPORT_EXPERIMENT_SOURCE_STABLE_DIRECT_LIGHTING)\n );\n}\n\nfn sample_environment_direct_light(\n hit: HitRecord,\n ray: RayRecord,\n normal: vec3<f32>,\n selector: f32,\n environmentSelectionProbability: f32\n) -> DirectLightSample {\n let environmentUv = sample_dimension_2d(\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_DIRECT_ENVIRONMENT,\n config.samplesPerPixel\n );\n var lightDirection = normal;\n var radiance = vec3<f32>(0.0);\n var pdf = 0.0;\n if (strict_physical_low_spp_lighting_enabled() && !environment_importance_sampling_enabled()) {\n if (transport_experiment_enabled(TRANSPORT_EXPERIMENT_PRODUCT_STUDIO_IMPORTANCE)) {\n lightDirection = cosine_sample_hemisphere(environmentUv, normal);\n radiance = procedural_sky_radiance(lightDirection);\n pdf = cosine_hemisphere_pdf(normal, lightDirection);\n } else {\n lightDirection = sample_uniform_hemisphere_direction(environmentUv, normal);\n radiance = procedural_sky_radiance(lightDirection);\n pdf = uniform_hemisphere_pdf();\n }\n } else {\n let environmentSample = sample_environment_importance(vec2<f32>(\n selector / max(environmentSelectionProbability, 0.000001),\n environmentUv.y\n ));\n lightDirection = safe_normalize(environmentSample.direction, normal);\n radiance = direct_environment_radiance(\n offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection),\n lightDirection\n );\n pdf = environmentSample.pdf;\n }\n return DirectLightSample(\n vec4<f32>(lightDirection, 0.0),\n vec4<f32>(radiance, 0.0),\n pdf * environmentSelectionProbability,\n 1000000.0,\n 0u,\n 1u\n );\n}\n\nfn sample_emissive_direct_light(\n hit: HitRecord,\n ray: RayRecord,\n environmentSelectionProbability: f32\n) -> DirectLightSample {\n let emissiveSample = sample_emissive_triangle_light(\n hit,\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_EMISSIVE_LIGHT_SELECTION,\n SAMPLE_DIM_EMISSIVE_LIGHT_SURFACE\n );\n if (emissiveSample.valid == 0u) {\n return emissiveSample;\n }\n return DirectLightSample(\n emissiveSample.direction,\n emissiveSample.radiance,\n emissiveSample.pdf * (1.0 - environmentSelectionProbability),\n emissiveSample.maxDistance,\n emissiveSample.flags,\n emissiveSample.valid\n );\n}\n\nfn sample_direct_light(hit: HitRecord, ray: RayRecord, normal: vec3<f32>) -> DirectLightSample {\n let environmentSelectionProbability =\n 1.0 - emissive_direct_class_probability();\n let selector = sample_dimension_1d(\n direct_light_sample_pixel_id(ray),\n ray.sampleId,\n ray.bounce,\n direct_light_sample_frame_index(),\n SAMPLE_DIM_DIRECT_LIGHT_SELECTOR\n );\n if (selector < environmentSelectionProbability) {\n return sample_environment_direct_light(hit, ray, normal, selector, environmentSelectionProbability);\n }\n return sample_emissive_direct_light(hit, ray, environmentSelectionProbability);\n}\n\nfn direct_light_sample_contribution(ray: RayRecord, hit: HitRecord, lightSample: DirectLightSample) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n if (lightSample.valid == 0u) {\n return vec3<f32>(0.0);\n }\n if (lightSample.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let lightDirection = safe_normalize(lightSample.direction.xyz, normal);\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection);\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotL <= 0.000001) {\n return vec3<f32>(0.0);\n }\n if (scene_visibility_blocked(origin, lightDirection, lightSample.maxDistance)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance = lightSample.radiance.xyz;\n if (max_component(incidentRadiance) <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n if (max_component(bsdf) <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let bsdfPdf = evaluate_surface_bsdf_pdf(hit, viewDirection, lightDirection);\n let misWeight = power_heuristic(lightSample.pdf, bsdfPdf);\n let contribution = select(\n ray.throughput.xyz *\n bsdf *\n incidentRadiance *\n (nDotL * misWeight / max(lightSample.pdf, 0.000001)),\n ray.throughput.xyz * bsdf * incidentRadiance * nDotL,\n (lightSample.flags & DIRECT_LIGHT_FLAG_DELTA) != 0u\n );\n return sanitize_linear_radiance(contribution);\n}\n\nfn surface_direct_light_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = surface_shading_normal(hit);\n if (transport_experiment_enabled(TRANSPORT_EXPERIMENT_DETERMINISTIC_DIRECT_LIGHTING)) {\n let environmentLight = sample_environment_direct_light(hit, ray, normal, 0.5, 1.0);\n let emissiveLight = sample_emissive_direct_light(hit, ray, 0.0);\n return sanitize_linear_radiance(\n direct_light_sample_contribution(ray, hit, environmentLight) +\n direct_light_sample_contribution(ray, hit, emissiveLight)\n );\n }\n return direct_light_sample_contribution(ray, hit, sample_direct_light(hit, ray, normal));\n}\n\nfn surface_procedural_sun_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n if (!strict_physical_low_spp_lighting_enabled() || environment_map_enabled()) {\n return vec3<f32>(0.0);\n }\n let normal = surface_shading_normal(hit);\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let lightDirection = safe_normalize(\n config.environmentSunDirectionIntensity.xyz,\n vec3<f32>(0.0, 1.0, 0.0)\n );\n let nDotL = saturate(dot(normal, lightDirection));\n if (nDotL <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let origin = offset_origin(hit.position.xyz, hit.geometricNormal.xyz, hit.shadingNormal.xyz, lightDirection);\n if (scene_visibility_blocked(origin, lightDirection, 1000000.0)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance =\n max(config.environmentSunColor.xyz, vec3<f32>(0.0)) *\n max(config.environmentSunDirectionIntensity.w, 0.0001);\n let bsdf = evaluate_surface_bsdf(hit, viewDirection, lightDirection);\n return sanitize_linear_radiance(ray.throughput.xyz * bsdf * incidentRadiance * nDotL);\n}\n\n`;\n","export const WAVEFRONT_SHADER_MATERIALS_WGSL = `\nfn srgb_to_linear_channel(value: f32) -> f32 {\n if (value <= 0.04045) {\n return value / 12.92;\n }\n return pow((value + 0.055) / 1.055, 2.4);\n}\n\nfn srgb_to_linear_vec3(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n srgb_to_linear_channel(value.x),\n srgb_to_linear_channel(value.y),\n srgb_to_linear_channel(value.z)\n );\n}\n\nfn wrap_uv(uv: vec2<f32>) -> vec2<f32> {\n return fract(fract(uv) + vec2<f32>(1.0));\n}\n\nfn atlas_sample_uv(rect: vec4<f32>, uv: vec2<f32>) -> vec2<f32> {\n let local = wrap_uv(uv);\n let clamped = clamp(local, vec2<f32>(0.001), vec2<f32>(0.999));\n return rect.xy + clamped * rect.zw;\n}\n\nfn sample_atlas(textureRef: texture_2d<f32>, rect: vec4<f32>, uv: vec2<f32>) -> vec4<f32> {\n return textureSampleLevel(textureRef, materialAtlasSampler, atlas_sample_uv(rect, uv), 0.0);\n}\n\nfn build_triangle_tangent_basis(\n triangle: TriangleRecord,\n fallbackNormal: vec3<f32>\n) -> TangentBasis {\n let edge1 = triangle.v1.xyz - triangle.v0.xyz;\n let edge2 = triangle.v2.xyz - triangle.v0.xyz;\n let uv0 = triangle.uv0uv1.xy;\n let uv1 = triangle.uv0uv1.zw;\n let uv2 = triangle.uv2Pad.xy;\n let deltaUv1 = uv1 - uv0;\n let deltaUv2 = uv2 - uv0;\n let determinant = deltaUv1.x * deltaUv2.y - deltaUv1.y * deltaUv2.x;\n if (abs(determinant) <= 0.000001) {\n let tangentFallback = select(vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(1.0, 0.0, 0.0), abs(fallbackNormal.y) >= 0.999);\n let tangent = safe_normalize(cross(tangentFallback, fallbackNormal), vec3<f32>(1.0, 0.0, 0.0));\n let bitangent = safe_normalize(cross(fallbackNormal, tangent), vec3<f32>(0.0, 0.0, 1.0));\n return TangentBasis(tangent, bitangent);\n }\n let inverse = 1.0 / determinant;\n let tangent = safe_normalize(\n inverse * (edge1 * deltaUv2.y - edge2 * deltaUv1.y),\n vec3<f32>(1.0, 0.0, 0.0)\n );\n let bitangent = safe_normalize(\n inverse * (-edge1 * deltaUv2.x + edge2 * deltaUv1.x),\n vec3<f32>(0.0, 0.0, 1.0)\n );\n return TangentBasis(tangent, bitangent);\n}\n\nfn sample_surface_material(\n triangle: TriangleRecord,\n uv: vec2<f32>,\n geometricNormal: vec3<f32>,\n shadingNormal: vec3<f32>\n) -> SurfaceMaterialSample {\n let baseColorTexel = sample_atlas(baseColorAtlasTexture, triangle.baseColorAtlas, uv);\n let baseColor = vec4<f32>(\n clamp(triangle.color.rgb * srgb_to_linear_vec3(baseColorTexel.rgb), vec3<f32>(0.0), vec3<f32>(1.0)),\n clamp(triangle.color.a * baseColorTexel.a, 0.0, 1.0)\n );\n let metallicRoughnessTexel = sample_atlas(\n metallicRoughnessAtlasTexture,\n triangle.metallicRoughnessAtlas,\n uv\n );\n let normalTexel = sample_atlas(normalAtlasTexture, triangle.normalAtlas, uv);\n let occlusionTexel = sample_atlas(occlusionAtlasTexture, triangle.occlusionAtlas, uv);\n let emissiveTexel = sample_atlas(emissiveAtlasTexture, triangle.emissiveAtlas, uv);\n let clearcoatTexel = sample_atlas(clearcoatAtlasTexture, triangle.clearcoatAtlas, uv);\n let clearcoatRoughnessTexel = sample_atlas(\n clearcoatRoughnessAtlasTexture,\n triangle.clearcoatRoughnessAtlas,\n uv\n );\n let clearcoatNormalTexel = sample_atlas(\n clearcoatNormalAtlasTexture,\n triangle.clearcoatNormalAtlas,\n uv\n );\n let transmissionTexel = sample_atlas(transmissionAtlasTexture, triangle.transmissionAtlas, uv);\n let thicknessTexel = sample_atlas(thicknessAtlasTexture, triangle.thicknessAtlas, uv);\n let sheenColorTexel = sample_atlas(sheenColorAtlasTexture, triangle.sheenColorAtlas, uv);\n let sheenRoughnessTexel = sample_atlas(\n sheenRoughnessAtlasTexture,\n triangle.sheenRoughnessAtlas,\n uv\n );\n let specularTexel = sample_atlas(specularAtlasTexture, triangle.specularAtlas, uv);\n let specularColorTexel = sample_atlas(\n specularColorAtlasTexture,\n triangle.specularColorAtlas,\n uv\n );\n let iridescenceTexel = sample_atlas(iridescenceAtlasTexture, triangle.iridescenceAtlas, uv);\n let iridescenceThicknessTexel = sample_atlas(\n iridescenceThicknessAtlasTexture,\n triangle.iridescenceThicknessAtlas,\n uv\n );\n let anisotropyTexel = sample_atlas(anisotropyAtlasTexture, triangle.anisotropyAtlas, uv);\n let normalScale = clamp(triangle.textureSettings.x, 0.0, 1.0);\n let tangentBasis = build_triangle_tangent_basis(triangle, geometricNormal);\n let tangentNormal = safe_normalize(\n vec3<f32>(\n (normalTexel.x * 2.0 - 1.0) * normalScale,\n (normalTexel.y * 2.0 - 1.0) * normalScale,\n 1.0 + ((normalTexel.z * 2.0 - 1.0) - 1.0) * normalScale\n ),\n vec3<f32>(0.0, 0.0, 1.0)\n );\n let mappedNormal = safe_normalize(\n tangentBasis.tangent * tangentNormal.x +\n tangentBasis.bitangent * tangentNormal.y +\n shadingNormal * tangentNormal.z,\n shadingNormal\n );\n let emission = vec4<f32>(\n max(\n triangle.emission.rgb *\n srgb_to_linear_vec3(emissiveTexel.rgb) *\n max(triangle.textureSettings.z, 0.0),\n vec3<f32>(0.0)\n ),\n clamp(triangle.emission.a * emissiveTexel.a, 0.0, 1.0)\n );\n return SurfaceMaterialSample(\n baseColor,\n emission,\n vec4<f32>(\n clamp(triangle.material.x * metallicRoughnessTexel.y, 0.0, 1.0),\n clamp(triangle.material.y * metallicRoughnessTexel.z, 0.0, 1.0),\n clamp(triangle.material.z * baseColor.a, 0.0, 1.0),\n clamp(triangle.material.w, 1.0, 3.0)\n ),\n vec4<f32>(\n triangle.materialResponse.rgb * sheenColorTexel.rgb,\n triangle.materialResponse.w * clearcoatTexel.r * clearcoatNormalTexel.r\n ),\n vec4<f32>(\n triangle.materialExtension.x * clearcoatRoughnessTexel.r * (0.5 + 0.5 * sheenRoughnessTexel.r),\n triangle.materialExtension.y * specularTexel.r * (0.5 + 0.5 * iridescenceTexel.r),\n triangle.materialExtension.z * transmissionTexel.r,\n triangle.materialExtension.w * thicknessTexel.r * (0.5 + 0.5 * iridescenceThicknessTexel.r)\n ),\n vec4<f32>(\n triangle.specularColor.rgb * specularColorTexel.rgb * (0.5 + 0.5 * anisotropyTexel.r),\n triangle.specularColor.a\n ),\n repair_shading_normal(geometricNormal, mappedNormal),\n clamp(\n mix(1.0, occlusionTexel.x, clamp(triangle.textureSettings.y, 0.0, 1.0)),\n 0.0,\n 1.0\n )\n );\n}\n\nfn saturate(value: f32) -> f32 {\n return clamp(value, 0.0, 1.0);\n}\n\nfn max_component(value: vec3<f32>) -> f32 {\n return max(max(value.x, value.y), value.z);\n}\n\nfn radiance_luminance(value: vec3<f32>) -> f32 {\n return dot(value, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn environment_map_enabled() -> bool {\n return config.environmentMapSettings.x > 0.5;\n}\n\nfn deferred_path_resolve_enabled() -> bool {\n return config.pathResolveSettings.x > 0.5;\n}\n\nfn strict_physical_low_spp_lighting_enabled() -> bool {\n return config.pathResolveSettings.z > 0.5;\n}\n\nfn path_vertex_count_per_ray() -> u32 {\n return config.maxDepth + 1u;\n}\n\nfn path_vertex_index(rayId: u32, depth: u32) -> u32 {\n return rayId * path_vertex_count_per_ray() + min(depth, config.maxDepth);\n}\n\nfn clear_deferred_path(rayId: u32) {\n if (!deferred_path_resolve_enabled()) {\n return;\n }\n\n for (var depth = 0u; depth <= config.maxDepth; depth = depth + 1u) {\n pathVertices[path_vertex_index(rayId, depth)] = vec4<f32>(0.0);\n if (depth == config.maxDepth) {\n break;\n }\n }\n}\n\nfn sanitize_path_throughput_component(value: f32) -> f32 {\n if (value != value || value <= 0.0) {\n return 0.0;\n }\n return min(value, 65504.0);\n}\n\nfn sanitize_path_throughput(value: vec3<f32>) -> vec3<f32> {\n return vec3<f32>(\n sanitize_path_throughput_component(value.x),\n sanitize_path_throughput_component(value.y),\n sanitize_path_throughput_component(value.z)\n );\n}\n\nfn record_deferred_path_throughput(ray: RayRecord, throughput: vec3<f32>) {\n if (!deferred_path_resolve_enabled() || ray.rayId >= config.tilePixelCount || ray.bounce >= config.maxDepth) {\n return;\n }\n pathVertices[path_vertex_index(ray.rayId, ray.bounce)] =\n vec4<f32>(sanitize_path_throughput(throughput), 1.0);\n}\n\nfn record_deferred_terminal_source(ray: RayRecord, sourceRadiance: vec3<f32>, sourceKind: u32) {\n if (!deferred_path_resolve_enabled() || ray.rayId >= config.tilePixelCount) {\n return;\n }\n pathVertices[path_vertex_index(ray.rayId, config.maxDepth)] =\n vec4<f32>(sanitize_linear_radiance(sourceRadiance), f32(sourceKind));\n}\n`;\n","export const PRESENT_WGSL = `\nstruct VertexOut {\n @builtin(position) position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n};\n\n@vertex\nfn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOut {\n var positions = array<vec2<f32>, 3>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(3.0, -1.0),\n vec2<f32>(-1.0, 3.0)\n );\n var uvs = array<vec2<f32>, 3>(\n vec2<f32>(0.0, 1.0),\n vec2<f32>(2.0, 1.0),\n vec2<f32>(0.0, -1.0)\n );\n var out: VertexOut;\n out.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);\n out.uv = uvs[vertexIndex];\n return out;\n}\n\n@group(0) @binding(0) var renderTexture: texture_2d<f32>;\n@group(0) @binding(1) var renderSampler: sampler;\n\n@fragment\nfn fragmentMain(in: VertexOut) -> @location(0) vec4<f32> {\n return textureSample(renderTexture, renderSampler, in.uv);\n}\n`;\n","import { WAVEFRONT_COMPUTE_WORKGROUP_SIZE } from \"./wavefront-workgroup.js\";\nimport { WAVEFRONT_SHADER_BVH_WGSL } from \"./wavefront-shader-bvh.js\";\nimport { WAVEFRONT_SHADER_KERNELS_WGSL } from \"./wavefront-shader-kernels.js\";\nimport { WAVEFRONT_SHADER_LAYOUT_WGSL } from \"./wavefront-shader-layout.js\";\nimport { WAVEFRONT_SHADER_LIGHTING_WGSL } from \"./wavefront-shader-lighting.js\";\nimport { WAVEFRONT_SHADER_MATERIALS_WGSL } from \"./wavefront-shader-materials.js\";\nexport { PRESENT_WGSL } from \"./wavefront-present-shader.js\";\n\nfunction readPositiveInteger(name, value, fallback) {\n if (value === undefined || value === null) {\n return fallback;\n }\n const numeric = Number(value);\n if (!Number.isInteger(numeric) || numeric <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return numeric;\n}\n\nexport const WAVEFRONT_COMPUTE_WGSL = [\n WAVEFRONT_SHADER_LAYOUT_WGSL,\n WAVEFRONT_SHADER_MATERIALS_WGSL,\n WAVEFRONT_SHADER_LIGHTING_WGSL,\n WAVEFRONT_SHADER_BVH_WGSL,\n WAVEFRONT_SHADER_KERNELS_WGSL,\n].join(\"\\n\");\n\nexport function createWavefrontPathTracingComputeShaderSource(options = {}) {\n const workgroupSize = readPositiveInteger(\n \"workgroupSize\",\n options.workgroupSize ?? WAVEFRONT_COMPUTE_WORKGROUP_SIZE,\n WAVEFRONT_COMPUTE_WORKGROUP_SIZE\n );\n if (workgroupSize !== WAVEFRONT_COMPUTE_WORKGROUP_SIZE) {\n throw new Error(`wavefront mesh compute currently requires workgroupSize=${WAVEFRONT_COMPUTE_WORKGROUP_SIZE}`);\n }\n return WAVEFRONT_COMPUTE_WGSL;\n}\n","import {\n assertShaderModuleCompiles,\n createComputePipeline,\n createRenderPipeline,\n} from \"./wavefront-runtime-support.js\";\nimport { PRESENT_WGSL, WAVEFRONT_COMPUTE_WGSL } from \"./wavefront-shaders.js\";\nimport { CONFIG_BUFFER_BYTES } from \"./wavefront-core.js\";\n\nexport function createWavefrontBindGroupLayouts(device, constants) {\n const trace = device.createBindGroupLayout({\n label: \"plasius.wavefront.traceBindGroupLayout\",\n entries: [\n { binding: 0, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 1, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 2, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 3, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 4, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n { binding: 6, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n {\n binding: 7,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba8unorm\" },\n },\n { binding: 8, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 9, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n {\n binding: 16,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba16float\" },\n },\n { binding: 19, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 20, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 21, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 22, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 23, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 24, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 25, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 26, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 27, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 28, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 29, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 30, visibility: constants.shader.COMPUTE, sampler: { type: \"filtering\" } },\n { binding: 31, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 32, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 33, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 34, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 35, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 36, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 37, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 38, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 39, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 40, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 41, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 42, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 43, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n { binding: 44, visibility: constants.shader.COMPUTE, texture: { sampleType: \"float\" } },\n ],\n });\n const acceleration = device.createBindGroupLayout({\n label: \"plasius.wavefront.accelerationBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n { binding: 8, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 9, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n { binding: 10, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 11, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 12, visibility: constants.shader.COMPUTE, buffer: { type: \"read-only-storage\" } },\n { binding: 13, visibility: constants.shader.COMPUTE, buffer: { type: \"storage\" } },\n ],\n });\n const denoiseRadiance = device.createBindGroupLayout({\n label: \"plasius.wavefront.denoiseRadianceBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n {\n binding: 14,\n visibility: constants.shader.COMPUTE,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 15,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba16float\" },\n },\n ],\n });\n const denoiseResolve = device.createBindGroupLayout({\n label: \"plasius.wavefront.denoiseResolveBindGroupLayout\",\n entries: [\n {\n binding: 5,\n visibility: constants.shader.COMPUTE,\n buffer: { type: \"uniform\", hasDynamicOffset: true, minBindingSize: CONFIG_BUFFER_BYTES },\n },\n {\n binding: 17,\n visibility: constants.shader.COMPUTE,\n texture: { sampleType: \"float\" },\n },\n {\n binding: 18,\n visibility: constants.shader.COMPUTE,\n storageTexture: { access: \"write-only\", format: \"rgba8unorm\" },\n },\n ],\n });\n const present = device.createBindGroupLayout({\n label: \"plasius.wavefront.presentBindGroupLayout\",\n entries: [\n { binding: 0, visibility: constants.shader.FRAGMENT, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: constants.shader.FRAGMENT, sampler: { type: \"filtering\" } },\n ],\n });\n\n return Object.freeze({\n trace,\n acceleration,\n denoiseRadiance,\n denoiseResolve,\n present,\n });\n}\n\nexport function createWavefrontPipelineLayouts(device, bindGroupLayouts) {\n return Object.freeze({\n trace: device.createPipelineLayout({\n label: \"plasius.wavefront.tracePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.trace],\n }),\n acceleration: device.createPipelineLayout({\n label: \"plasius.wavefront.accelerationPipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.acceleration],\n }),\n denoiseRadiance: device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseRadiancePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.denoiseRadiance],\n }),\n denoiseResolve: device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseResolvePipelineLayout\",\n bindGroupLayouts: [bindGroupLayouts.denoiseResolve],\n }),\n });\n}\n\nexport async function createWavefrontComputePipelines(device, computeShader, pipelineLayouts) {\n return Object.freeze({\n prepareMeshTrianglesAndLeaves: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"prepareMeshTrianglesAndLeaves\",\n \"plasius.wavefront.prepareMeshTrianglesAndLeaves\"\n ),\n sortBvhLeafRefs: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"sortBvhLeafRefs\",\n \"plasius.wavefront.sortBvhLeafRefs\"\n ),\n writeSortedBvhLeaves: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"writeSortedBvhLeaves\",\n \"plasius.wavefront.writeSortedBvhLeaves\"\n ),\n buildBvhInternalLevel: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.acceleration,\n \"buildBvhInternalLevel\",\n \"plasius.wavefront.buildBvhInternalLevel\"\n ),\n generatePrimaryRays: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"generatePrimaryRays\",\n \"plasius.wavefront.generatePrimaryRays\"\n ),\n intersectActiveQueue: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"intersectActiveQueue\",\n \"plasius.wavefront.intersectActiveQueue\"\n ),\n resolveSurfaceRecords: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"resolveSurfaceRecords\",\n \"plasius.wavefront.resolveSurfaceRecords\"\n ),\n compactAndSwapQueues: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"compactAndSwapQueues\",\n \"plasius.wavefront.compactAndSwapQueues\"\n ),\n accumulateTerminalRadiance: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.trace,\n \"accumulateTerminalRadiance\",\n \"plasius.wavefront.accumulateTerminalRadiance\"\n ),\n denoiseLinearRadiance: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.denoiseRadiance,\n \"denoiseLinearRadiance\",\n \"plasius.wavefront.denoiseLinearRadiance\"\n ),\n resolveDenoisedOutputImage: await createComputePipeline(\n device,\n computeShader,\n pipelineLayouts.denoiseResolve,\n \"resolveDenoisedOutputImage\",\n \"plasius.wavefront.resolveDenoisedOutputImage\"\n ),\n });\n}\n\nexport async function createWavefrontPresentPipeline(device, presentBindGroupLayout, format) {\n const presentShader = device.createShaderModule({\n label: \"plasius.wavefront.presentShader\",\n code: PRESENT_WGSL,\n });\n return createRenderPipeline(device, {\n label: \"plasius.wavefront.presentPipeline\",\n layout: device.createPipelineLayout({\n label: \"plasius.wavefront.presentPipelineLayout\",\n bindGroupLayouts: [presentBindGroupLayout],\n }),\n vertex: { module: presentShader, entryPoint: \"vertexMain\" },\n fragment: {\n module: presentShader,\n entryPoint: \"fragmentMain\",\n targets: [{ format }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n}\n\nexport async function createWavefrontPipelineResources({ device, constants, format }) {\n const bindGroupLayouts = createWavefrontBindGroupLayouts(device, constants);\n const pipelineLayouts = createWavefrontPipelineLayouts(device, bindGroupLayouts);\n const computeShader = device.createShaderModule({\n label: \"plasius.wavefront.computeShader\",\n code: WAVEFRONT_COMPUTE_WGSL,\n });\n await assertShaderModuleCompiles(computeShader, \"plasius.wavefront.computeShader\");\n\n return Object.freeze({\n bindGroupLayouts,\n pipelineLayouts,\n computePipelines: await createWavefrontComputePipelines(\n device,\n computeShader,\n pipelineLayouts\n ),\n presentPipeline: await createWavefrontPresentPipeline(\n device,\n bindGroupLayouts.present,\n format\n ),\n });\n}\n","import {\n COUNTER_BUFFER_BYTES,\n COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET,\n COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET,\n COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET,\n COUNTER_TERMINATION_EMISSIVE_OFFSET,\n COUNTER_TERMINATION_ENVIRONMENT_OFFSET,\n COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET,\n COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET,\n COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET,\n COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET,\n COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET,\n COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET,\n COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_CHECKSUM_OFFSET,\n COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET,\n COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET,\n EMPTY_TERMINATION_METRICS,\n GPU_READBACK_COMPLETION_TIMEOUT_MS,\n TERMINATION_LUMINANCE_SCALE,\n clamp,\n readNonNegativeInteger,\n} from \"./wavefront-core.js\";\n\nexport async function readWavefrontTerminationMetrics({\n device,\n constants,\n counterBuffer,\n waitForSubmittedGpuWork,\n}) {\n const mapMode = constants.map;\n if (!mapMode) {\n return EMPTY_TERMINATION_METRICS;\n }\n const readback = device.createBuffer({\n label: \"plasius.wavefront.terminationMetrics\",\n size: COUNTER_BUFFER_BYTES,\n usage: constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n });\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.terminationMetrics.copy\",\n });\n encoder.copyBufferToBuffer(counterBuffer, 0, readback, 0, COUNTER_BUFFER_BYTES);\n device.queue.submit([encoder.finish()]);\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await readback.mapAsync(mapMode.READ);\n const countersView = new Uint32Array(readback.getMappedRange().slice(0));\n readback.unmap();\n readback.destroy?.();\n const emissive = countersView[COUNTER_TERMINATION_EMISSIVE_OFFSET] ?? 0;\n const environment = countersView[COUNTER_TERMINATION_ENVIRONMENT_OFFSET] ?? 0;\n const maxDepth = countersView[COUNTER_TERMINATION_AMBIENT_MAX_DEPTH_OFFSET] ?? 0;\n const queueOverflow = countersView[COUNTER_TERMINATION_QUEUE_OVERFLOW_OFFSET] ?? 0;\n const invalidSamples = countersView[COUNTER_TERMINATION_INVALID_SAMPLE_OFFSET] ?? 0;\n const legacyClampEquivalentSamples =\n countersView[COUNTER_TERMINATION_LEGACY_CLAMP_EQUIVALENT_OFFSET] ?? 0;\n const absorptionNull = countersView[COUNTER_TERMINATION_ABSORPTION_NULL_OFFSET] ?? 0;\n const russianRoulette = countersView[COUNTER_TERMINATION_RUSSIAN_ROULETTE_OFFSET] ?? 0;\n const strictMaxDepth = countersView[COUNTER_TERMINATION_MAX_DEPTH_STRICT_OFFSET] ?? 0;\n const deterministicResidualZero =\n countersView[COUNTER_TERMINATION_DETERMINISTIC_RESIDUAL_ZERO_OFFSET] ?? 0;\n const directExplicitLuminance =\n (countersView[COUNTER_TRANSPORT_DIRECT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const cachedIndirectLuminance =\n (countersView[COUNTER_TRANSPORT_CACHED_INDIRECT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const stochasticResidualLuminance =\n (countersView[COUNTER_TRANSPORT_RESIDUAL_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const zeroTerminationCount = countersView[COUNTER_TRANSPORT_ZERO_TERMINATION_OFFSET] ?? 0;\n const deterministicChecksum = countersView[COUNTER_TRANSPORT_CHECKSUM_OFFSET] ?? 0;\n const ambientResidualLuminance =\n (countersView[COUNTER_TERMINATION_AMBIENT_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const totalLuminance =\n (countersView[COUNTER_TERMINATION_TOTAL_LUMINANCE_OFFSET] ?? 0) /\n TERMINATION_LUMINANCE_SCALE;\n const ambientResidualShare =\n totalLuminance > 0 ? ambientResidualLuminance / totalLuminance : 0;\n return Object.freeze({\n termination: Object.freeze({\n emissive,\n environment,\n ambientFallback: maxDepth + queueOverflow,\n maxDepth,\n absorptionNull,\n russianRoulette,\n strictMaxDepth,\n deterministicResidualZero,\n }),\n queueOverflow,\n terminalRadiance: Object.freeze({\n totalLuminance,\n ambientResidualLuminance,\n ambientResidualShare,\n }),\n radianceDiagnostics: Object.freeze({\n invalidSamples,\n legacyClampEquivalentSamples,\n }),\n transportContributions: Object.freeze({\n directExplicitLuminance,\n cachedIndirectLuminance,\n stochasticResidualLuminance,\n zeroTerminationCount,\n deterministicChecksum,\n }),\n });\n}\n\nexport async function readWavefrontOutputProbe({\n device,\n constants,\n config,\n outputTexture,\n waitForSubmittedGpuWork,\n optionsForProbe = {},\n}) {\n const mapMode = constants.map;\n if (!mapMode) {\n throw new Error(\"GPUMapMode.READ is unavailable in this environment.\");\n }\n const x = clamp(\n readNonNegativeInteger(\"x\", optionsForProbe.x, Math.floor(config.width / 2)),\n 0,\n config.width - 1\n );\n const y = clamp(\n readNonNegativeInteger(\"y\", optionsForProbe.y, Math.floor(config.height / 2)),\n 0,\n config.height - 1\n );\n const readback = device.createBuffer({\n label: \"plasius.wavefront.outputProbe\",\n size: 256,\n usage: constants.buffer.COPY_DST | constants.buffer.MAP_READ,\n });\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n const encoder = device.createCommandEncoder({\n label: \"plasius.wavefront.outputProbe.copy\",\n });\n encoder.copyTextureToBuffer(\n { texture: outputTexture, origin: { x, y } },\n { buffer: readback, bytesPerRow: 256, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 }\n );\n device.queue.submit([encoder.finish()]);\n await waitForSubmittedGpuWork({\n timeoutMs: GPU_READBACK_COMPLETION_TIMEOUT_MS,\n allowTimeout: false,\n });\n await readback.mapAsync(mapMode.READ);\n const bytes = new Uint8Array(readback.getMappedRange()).slice(0, 4);\n readback.unmap();\n readback.destroy?.();\n return Object.freeze({\n x,\n y,\n rgba: Object.freeze(Array.from(bytes)),\n luminance: (0.2126 * bytes[0] + 0.7152 * bytes[1] + 0.0722 * bytes[2]) / 255,\n });\n}\n","import {\n DEFAULT_ENVIRONMENT_LIGHTING,\n add,\n asUnitVec3,\n asVec3,\n clamp,\n cross,\n dot,\n normalize,\n readFiniteNumber,\n readNonNegativeInteger,\n readPositiveInteger,\n scale,\n subtract,\n} from \"./wavefront-core.js\";\nimport {\n sampleWavefrontDimension2D,\n WAVEFRONT_SAMPLE_DIMENSIONS,\n} from \"./wavefront-sampling-dimensions.js\";\nimport {\n distributionGgx,\n geometrySmith,\n hammersley,\n integrateBrdfSample,\n localToWorld,\n reflectVector,\n} from \"./wavefront-sampling.js\";\n\nfunction evaluateReferenceEnvironmentRadiance(config, origin, direction) {\n void origin;\n const rayDirection = normalize(direction, [0, 1, 0]);\n const upFactor = clamp(rayDirection[1] * 0.5 + 0.5, 0, 1);\n const sunDirection = normalize(\n config.environmentLighting?.sunDirection ?? DEFAULT_ENVIRONMENT_LIGHTING.sunDirection,\n DEFAULT_ENVIRONMENT_LIGHTING.sunDirection\n );\n const sunGlow = Math.pow(clamp(dot(rayDirection, sunDirection), 0, 1), 192);\n const horizonColor =\n config.environmentLighting?.horizonColor ?? DEFAULT_ENVIRONMENT_LIGHTING.horizonColor;\n const zenithColor =\n config.environmentLighting?.zenithColor ?? DEFAULT_ENVIRONMENT_LIGHTING.zenithColor;\n const sunColor = config.environmentLighting?.sunColor ?? DEFAULT_ENVIRONMENT_LIGHTING.sunColor;\n const intensity = Math.max(\n 0.0001,\n Number(config.environmentLighting?.intensity ?? DEFAULT_ENVIRONMENT_LIGHTING.intensity)\n );\n\n return Object.freeze([\n (horizonColor[0] * (1 - upFactor) + zenithColor[0] * upFactor + sunColor[0] * sunGlow) *\n intensity,\n (horizonColor[1] * (1 - upFactor) + zenithColor[1] * upFactor + sunColor[1] * sunGlow) *\n intensity,\n (horizonColor[2] * (1 - upFactor) + zenithColor[2] * upFactor + sunColor[2] * sunGlow) *\n intensity,\n 1,\n ]);\n}\n\nfunction normalizeReferenceTile(config, tileInput = {}) {\n const tileX = clamp(\n readNonNegativeInteger(\"tile.x\", tileInput.x, 0),\n 0,\n Math.max(0, config.width - 1)\n );\n const tileY = clamp(\n readNonNegativeInteger(\"tile.y\", tileInput.y, 0),\n 0,\n Math.max(0, config.height - 1)\n );\n const tileWidth = clamp(\n readPositiveInteger(\"tile.width\", tileInput.width, config.width - tileX),\n 1,\n config.width - tileX\n );\n const tileHeight = clamp(\n readPositiveInteger(\"tile.height\", tileInput.height, config.height - tileY),\n 1,\n config.height - tileY\n );\n\n return Object.freeze({\n x: tileX,\n y: tileY,\n width: tileWidth,\n height: tileHeight,\n });\n}\n\nfunction repairReferenceShadingNormal(geometricNormal, shadingNormal) {\n const normal = normalize(shadingNormal, geometricNormal);\n return dot(normal, geometricNormal) < 0 ? scale(normal, -1) : normal;\n}\n\nfunction readOptionalMaxDistance(value) {\n if (value === undefined || value === null) {\n return Number.POSITIVE_INFINITY;\n }\n const numeric = Number(value);\n if (!Number.isFinite(numeric) || numeric <= 0) {\n throw new Error(\"maxDistance must be a positive finite number when provided.\");\n }\n return numeric;\n}\n\nexport function createWavefrontReferenceRay(config, options = {}) {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"config must be a wavefront path tracing config.\");\n }\n\n const tile = normalizeReferenceTile(config, options.tile);\n const tilePixelCount = tile.width * tile.height;\n const pixelIndex = readNonNegativeInteger(\"pixelIndex\", options.pixelIndex, 0);\n if (pixelIndex >= tilePixelCount) {\n throw new Error(`pixelIndex ${pixelIndex} exceeds tile capacity ${tilePixelCount}.`);\n }\n\n const sampleIndex = readNonNegativeInteger(\"sampleIndex\", options.sampleIndex, 0);\n const frameIndex = readNonNegativeInteger(\"frameIndex\", options.frameIndex, config.frameIndex ?? 0);\n const jitterScale = clamp(readFiniteNumber(\"jitterScale\", options.jitterScale, 0.35), 0, 1);\n const localX = pixelIndex % tile.width;\n const localY = Math.floor(pixelIndex / tile.width);\n const pixelX = tile.x + localX;\n const pixelY = tile.y + localY;\n const sourcePixelId = pixelY * config.width + pixelX;\n const [jitterX, jitterY] = sampleWavefrontDimension2D(\n sourcePixelId,\n sampleIndex,\n 0,\n frameIndex,\n WAVEFRONT_SAMPLE_DIMENSIONS.cameraJitter,\n config.samplesPerPixel ?? 1\n ).map((value) => value - 0.5);\n const ndcX = ((pixelX + 0.5 + jitterX * jitterScale) / config.width) * 2 - 1;\n const ndcY = 1 - ((pixelY + 0.5 + jitterY * jitterScale) / config.height) * 2;\n const viewX = ndcX * config.camera.tanHalfFovY * config.camera.aspect;\n const viewY = ndcY * config.camera.tanHalfFovY;\n const direction = normalize(\n add(\n add(config.camera.forward, scale(config.camera.right, viewX)),\n scale(config.camera.up, viewY)\n ),\n config.camera.forward\n );\n\n return Object.freeze({\n rayId: pixelIndex,\n parentRayId: 0xffffffff,\n sourcePixelId,\n sampleId: sampleIndex,\n bounce: 0,\n mediumRefId: 0,\n mediumStackDepth: 0,\n mediumStack: Object.freeze([0, 0, 0, 0]),\n flags: 0,\n origin: Object.freeze([...config.camera.position]),\n direction: Object.freeze(direction),\n throughput: Object.freeze([1, 1, 1, 1]),\n pixelX,\n pixelY,\n });\n}\n\nexport function intersectWavefrontReferenceTriangle(ray, triangle, options = {}) {\n if (!ray || typeof ray !== \"object\") {\n throw new Error(\"ray must be a wavefront reference ray.\");\n }\n if (!triangle || typeof triangle !== \"object\") {\n throw new Error(\"triangle must be a wavefront triangle record.\");\n }\n\n const maxDistance = readOptionalMaxDistance(options.maxDistance);\n const triangleIndex = readNonNegativeInteger(\"triangleIndex\", options.triangleIndex, 0);\n const edge1 = subtract(triangle.v1, triangle.v0);\n const edge2 = subtract(triangle.v2, triangle.v0);\n const pvec = cross(ray.direction, edge2);\n const determinant = dot(edge1, pvec);\n if (Math.abs(determinant) < 0.0000001) {\n return null;\n }\n\n const invDet = 1 / determinant;\n const tvec = subtract(ray.origin, triangle.v0);\n const u = dot(tvec, pvec) * invDet;\n if (u < 0 || u > 1) {\n return null;\n }\n\n const qvec = cross(tvec, edge1);\n const v = dot(ray.direction, qvec) * invDet;\n if (v < 0 || u + v > 1) {\n return null;\n }\n\n const distance = dot(edge2, qvec) * invDet;\n if (distance <= 0.001 || distance > maxDistance) {\n return null;\n }\n\n const geometric = normalize(cross(edge1, edge2), [0, 1, 0]);\n const frontFace = dot(ray.direction, geometric) < 0;\n const orientedGeometric = frontFace ? geometric : scale(geometric, -1);\n const w = 1 - u - v;\n const interpolated = [\n triangle.n0[0] * w + triangle.n1[0] * u + triangle.n2[0] * v,\n triangle.n0[1] * w + triangle.n1[1] * u + triangle.n2[1] * v,\n triangle.n0[2] * w + triangle.n1[2] * u + triangle.n2[2] * v,\n ];\n const shadingNormal = repairReferenceShadingNormal(orientedGeometric, interpolated);\n const uv = [\n triangle.uv0[0] * w + triangle.uv1[0] * u + triangle.uv2[0] * v,\n triangle.uv0[1] * w + triangle.uv1[1] * u + triangle.uv2[1] * v,\n ];\n const position = add(ray.origin, scale(ray.direction, distance));\n\n return Object.freeze({\n hitType: \"surface\",\n rayId: ray.rayId,\n sourcePixelId: ray.sourcePixelId,\n distance,\n entityId: triangle.meshId,\n instanceId: 0,\n primitiveId: triangle.triangleId,\n materialId: triangle.materialKind,\n materialRefId: triangle.materialRefId,\n mediumRefId: triangle.mediumRefId,\n barycentrics: Object.freeze([w, u, v]),\n uv: Object.freeze(uv),\n geometricNormal: Object.freeze(orientedGeometric),\n shadingNormal: Object.freeze(shadingNormal),\n frontFace,\n triangleIndex,\n triangleId: triangle.triangleId,\n position: Object.freeze(position),\n color: triangle.color,\n emission: triangle.emission,\n material: triangle.material,\n materialResponse: triangle.materialResponse,\n });\n}\n\nfunction createWavefrontReferenceEnvironmentHit(config, ray) {\n const radiance = evaluateReferenceEnvironmentRadiance(config, ray.origin, ray.direction);\n return Object.freeze({\n hitType: \"environment\",\n rayId: ray.rayId,\n sourcePixelId: ray.sourcePixelId,\n distance: -1,\n entityId: 0,\n instanceId: 0,\n primitiveId: 0,\n materialId: 0,\n materialRefId: 0,\n mediumRefId: 0,\n barycentrics: Object.freeze([0, 0, 0]),\n uv: Object.freeze([0, 0]),\n geometricNormal: Object.freeze(scale(ray.direction, -1)),\n shadingNormal: Object.freeze(scale(ray.direction, -1)),\n frontFace: true,\n triangleIndex: -1,\n triangleId: -1,\n position: Object.freeze(add(ray.origin, scale(ray.direction, 1000))),\n color: Object.freeze([0, 0, 0, 0]),\n emission: radiance,\n material: Object.freeze([1, 0, 1, 1]),\n materialResponse: Object.freeze([0, 0, 0, 0]),\n });\n}\n\nexport function traceWavefrontReferenceTriangles(config, ray, triangles, options = {}) {\n if (!config || typeof config !== \"object\") {\n throw new Error(\"config must be a wavefront path tracing config.\");\n }\n\n const source = Array.isArray(triangles) ? triangles : [];\n let nearestHit = null;\n let nearestDistance = readOptionalMaxDistance(options.maxDistance);\n\n source.forEach((triangle, index) => {\n const hit = intersectWavefrontReferenceTriangle(ray, triangle, {\n maxDistance: Number.isFinite(nearestDistance) ? nearestDistance : undefined,\n triangleIndex: index,\n });\n if (hit && hit.distance < nearestDistance) {\n nearestDistance = hit.distance;\n nearestHit = hit;\n }\n });\n\n return nearestHit ?? createWavefrontReferenceEnvironmentHit(config, ray);\n}\n\nfunction maxComponentVec3(value) {\n return Math.max(value[0] ?? 0, value[1] ?? 0, value[2] ?? 0);\n}\n\nfunction clampVec3(value, min = 0, max = 1) {\n const minVec = Array.isArray(min) ? min : [min, min, min];\n const maxVec = Array.isArray(max) ? max : [max, max, max];\n return [\n clamp(Number(value?.[0]) || 0, minVec[0], maxVec[0]),\n clamp(Number(value?.[1]) || 0, minVec[1], maxVec[1]),\n clamp(Number(value?.[2]) || 0, minVec[2], maxVec[2]),\n ];\n}\n\nfunction maxVec3(left, right) {\n return [\n Math.max(left[0] ?? 0, right[0] ?? 0),\n Math.max(left[1] ?? 0, right[1] ?? 0),\n Math.max(left[2] ?? 0, right[2] ?? 0),\n ];\n}\n\nfunction multiplyVec3(left, right) {\n return [\n (left[0] ?? 0) * (right[0] ?? 0),\n (left[1] ?? 0) * (right[1] ?? 0),\n (left[2] ?? 0) * (right[2] ?? 0),\n ];\n}\n\nfunction addVec3(left, right) {\n return [\n (left[0] ?? 0) + (right[0] ?? 0),\n (left[1] ?? 0) + (right[1] ?? 0),\n (left[2] ?? 0) + (right[2] ?? 0),\n ];\n}\n\nfunction mixScalar(a, b, factor) {\n return a * (1 - factor) + b * factor;\n}\n\nfunction mixVec3(left, right, factor) {\n return [\n mixScalar(left[0] ?? 0, right[0] ?? 0, factor),\n mixScalar(left[1] ?? 0, right[1] ?? 0, factor),\n mixScalar(left[2] ?? 0, right[2] ?? 0, factor),\n ];\n}\n\nfunction sanitizeWavefrontPdf(value) {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return value;\n}\n\nfunction sanitizeWavefrontThroughputComponent(value) {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.min(value, 65504);\n}\n\nfunction sanitizeWavefrontThroughput(value) {\n return [\n sanitizeWavefrontThroughputComponent(value?.[0]),\n sanitizeWavefrontThroughputComponent(value?.[1]),\n sanitizeWavefrontThroughputComponent(value?.[2]),\n ];\n}\n\nfunction coerceWavefrontVec3(value, fallback) {\n const source = Array.isArray(value) ? value : [];\n return [\n Number.isFinite(source[0]) ? Number(source[0]) : fallback[0],\n Number.isFinite(source[1]) ? Number(source[1]) : fallback[1],\n Number.isFinite(source[2]) ? Number(source[2]) : fallback[2],\n ];\n}\n\nfunction sanitizeWavefrontSampleRadiance(value) {\n return [\n sanitizeWavefrontThroughputComponent(value?.[0]),\n sanitizeWavefrontThroughputComponent(value?.[1]),\n sanitizeWavefrontThroughputComponent(value?.[2]),\n ];\n}\n\nfunction fresnelSchlick(cosine, f0) {\n const factor = (1 - clamp(Number(cosine) || 0, 0, 1)) ** 5;\n return [\n (f0[0] ?? 0) + (1 - (f0[0] ?? 0)) * factor,\n (f0[1] ?? 0) + (1 - (f0[1] ?? 0)) * factor,\n (f0[2] ?? 0) + (1 - (f0[2] ?? 0)) * factor,\n ];\n}\n\nfunction normalizeWavefrontReferenceHit(input = {}) {\n const material = Array.isArray(input.material) ? input.material : [];\n const materialResponse = Array.isArray(input.materialResponse) ? input.materialResponse : [];\n const materialExtension = Array.isArray(input.materialExtension) ? input.materialExtension : [];\n return Object.freeze({\n color: Object.freeze(coerceWavefrontVec3(input.color, [0.8, 0.8, 0.8])),\n shadingNormal: Object.freeze(\n normalize(coerceWavefrontVec3(input.shadingNormal, [0, 1, 0]), [0, 1, 0])\n ),\n material: Object.freeze([\n clamp(Number(material[0] ?? input.roughness ?? 0.45) || 0, 0, 1),\n clamp(Number(material[1] ?? input.metallic ?? 0) || 0, 0, 1),\n clamp(Number(material[2] ?? 1) || 1, 0, 1),\n clamp(Number(material[3] ?? 1.45) || 1.45, 1, 3),\n ]),\n materialResponse: Object.freeze([\n clamp(Number(materialResponse[0] ?? input.sheen ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[1] ?? input.sheenTint ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[2] ?? input.anisotropy ?? 0) || 0, 0, 1),\n clamp(Number(materialResponse[3] ?? input.clearcoat ?? 0) || 0, 0, 1),\n ]),\n materialExtension: Object.freeze([\n clamp(Number(materialExtension[0] ?? input.clearcoatRoughness ?? 0.08) || 0, 0, 1),\n clamp(Number(materialExtension[1] ?? input.specularWeight ?? 1) || 0, 0, 1),\n clamp(Number(materialExtension[2] ?? input.transmission ?? 0) || 0, 0, 1),\n clamp(Number(materialExtension[3] ?? 0) || 0, 0, 1),\n ]),\n specularColor: Object.freeze(coerceWavefrontVec3(input.specularColor, [1, 1, 1])),\n occlusion: clamp(Number(input.occlusion ?? 1) || 0, 0, 1),\n materialKind: readNonNegativeInteger(\"materialKind\", input.materialKind, 0),\n position: Object.freeze(coerceWavefrontVec3(input.position, [0, 0, 0])),\n });\n}\n\nfunction surfaceSpecularF0Reference(hit, surfaceColor) {\n const metallic = clamp(hit.material[1], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const specularColor = clampVec3(hit.specularColor, 0, 1);\n const dielectricF0 = specularColor.map((value) => 0.04 * specularWeight * value);\n return mixVec3(dielectricF0, surfaceColor, metallic);\n}\n\nfunction surfaceBsdfSamplingWeightsReference(hit) {\n const metallic = clamp(hit.material[1], 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const diffuseWeight = clamp(\n (1 - metallic) * Math.max(1 - specularWeight * 0.5 - clearcoat * 0.25, 0.15),\n 0,\n 1\n );\n const specWeight = clamp(\n Math.max(metallic, specularWeight * 0.75) * (1 - clearcoat * 0.5),\n 0,\n 1\n );\n const clearcoatWeight = clamp(clearcoat, 0, 1);\n const totalWeight = Math.max(diffuseWeight + specWeight + clearcoatWeight, 0.000001);\n return Object.freeze([\n diffuseWeight / totalWeight,\n specWeight / totalWeight,\n clearcoatWeight / totalWeight,\n ]);\n}\n\nfunction evaluateWavefrontSurfaceBsdfReference(hitInput, viewDirectionInput, lightDirectionInput, ambientColor = [0.018, 0.022, 0.026]) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const viewDirection = normalize(viewDirectionInput, normal);\n const lightDirection = normalize(lightDirectionInput, normal);\n const surfaceColor = clampVec3(maxVec3(hit.color, scale(asVec3(ambientColor, [0.018, 0.022, 0.026]), 0.35)), 0, 1);\n const roughness = clamp(hit.material[0], 0, 1);\n const metallic = clamp(hit.material[1], 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const clearcoatRoughness = clamp(hit.materialExtension[0], 0, 1);\n const occlusion = clamp(hit.occlusion, 0, 1);\n const nDotV = clamp(dot(normal, viewDirection), 0, 1);\n const nDotL = clamp(dot(normal, lightDirection), 0, 1);\n if (nDotV <= 0 || nDotL <= 0) {\n return Object.freeze([0, 0, 0]);\n }\n const halfVector = normalize(add(viewDirection, lightDirection), normal);\n const vDotH = clamp(dot(viewDirection, halfVector), 0, 1);\n const f0 = surfaceSpecularF0Reference(hit, surfaceColor);\n const fresnel = fresnelSchlick(vDotH, f0);\n const nDotH = clamp(dot(normal, halfVector), 0, 1);\n const distribution = distributionGgx(nDotH, roughness);\n const geometry = geometrySmith(nDotV, nDotL, roughness);\n const specular = fresnel.map(\n (value) => (distribution * geometry * value) / Math.max(4 * nDotV * nDotL, 0.000001)\n );\n const diffuseWeight =\n (1 - metallic) * (1 - clearcoat * 0.24) * (1 - clamp(maxComponentVec3(fresnel), 0, 0.98));\n const diffuse = surfaceColor.map((value) => (value * diffuseWeight) / Math.PI);\n const clearcoatHalf = normalize(add(viewDirection, lightDirection), normal);\n const clearcoatVDotH = clamp(dot(viewDirection, clearcoatHalf), 0, 1);\n const clearcoatDistribution = distributionGgx(\n clamp(dot(normal, clearcoatHalf), 0, 1),\n Math.max(clearcoatRoughness, 0.02)\n );\n const clearcoatGeometry = geometrySmith(nDotV, nDotL, Math.max(clearcoatRoughness, 0.02));\n const clearcoatFresnel = fresnelSchlick(clearcoatVDotH, [0.04, 0.04, 0.04]);\n const clearcoatTerm = clearcoatFresnel.map(\n (value) =>\n ((clearcoatDistribution * clearcoatGeometry * value) /\n Math.max(4 * nDotV * nDotL, 0.000001)) *\n clearcoat\n );\n const occlusionWeight = mixScalar(0.42, 1, occlusion);\n return Object.freeze(\n addVec3(addVec3(diffuse, specular), clearcoatTerm).map((value) => value * occlusionWeight)\n );\n}\n\nfunction diffusePdfReference(normal, lightDirection) {\n return clamp(dot(normal, lightDirection), 0, 1) / Math.PI;\n}\n\nfunction ggxPdfReference(normal, viewDirection, lightDirection, roughness) {\n const halfVector = normalize(add(viewDirection, lightDirection), normal);\n const nDotH = clamp(dot(normal, halfVector), 0, 1);\n const vDotH = clamp(dot(viewDirection, halfVector), 0, 1);\n const distribution = distributionGgx(nDotH, roughness);\n return (distribution * nDotH) / Math.max(4 * vDotH, 0.000001);\n}\n\nfunction evaluateWavefrontSurfaceBsdfPdfReference(hitInput, viewDirectionInput, lightDirectionInput) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const viewDirection = normalize(viewDirectionInput, normal);\n const lightDirection = normalize(lightDirectionInput, normal);\n const roughness = clamp(hit.material[0], 0, 1);\n const weights = surfaceBsdfSamplingWeightsReference(hit);\n return (\n weights[0] * diffusePdfReference(normal, lightDirection) +\n weights[1] * ggxPdfReference(normal, viewDirection, lightDirection, Math.max(roughness, 0.02)) +\n weights[2] *\n ggxPdfReference(\n normal,\n viewDirection,\n lightDirection,\n Math.max(clamp(hit.materialExtension[0], 0, 1), 0.02)\n )\n );\n}\n\nfunction surfaceGlossinessReference(hitInput) {\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const roughness = clamp(hit.material[0], 0, 1);\n const metallic = clamp(hit.material[1], 0, 1);\n const sheen = clamp(maxComponentVec3(hit.materialResponse), 0, 1);\n const clearcoat = clamp(hit.materialResponse[3], 0, 1);\n const specularWeight = clamp(hit.materialExtension[1], 0, 1);\n const transmission = clamp(hit.materialExtension[2], 0, 1);\n const baseGloss = Math.max(\n clearcoat,\n Math.max(sheen * 0.72, Math.max(specularWeight * (0.38 + metallic * 0.62), transmission))\n );\n return clamp(baseGloss * (1 - roughness * 0.72) + metallic * (1 - roughness) * 0.35, 0, 1);\n}\n\nfunction glossyEnvironmentDirectionReference(incidentDirection, normal, roughness, normalBlendScale) {\n const reflectionDirection = reflectVector(incidentDirection, normal);\n const blend = clamp(roughness * roughness * normalBlendScale, 0, 0.92);\n return normalize(\n add(scale(reflectionDirection, 1 - blend), scale(normal, blend)),\n normal\n );\n}\n\nfunction wavefrontPowerHeuristicReference(pdfA, pdfB) {\n const a = sanitizeWavefrontPdf(pdfA);\n const b = sanitizeWavefrontPdf(pdfB);\n if (a <= 0) {\n return 0;\n }\n const a2 = a * a;\n const b2 = b * b;\n return a2 / Math.max(a2 + b2, 0.000001);\n}\n\nfunction sunlitBaselineRadianceReference(configInput, normal) {\n const config = configInput ?? {};\n const baseline = Math.max(\n 0,\n Number(config.environmentLighting?.sunlitBaseline ?? config.pathResolveBaseline ?? 0.16)\n );\n if (baseline <= 0.000001) {\n return [0, 0, 0];\n }\n const sunDirection = asUnitVec3(\n config.environmentLighting?.sunDirection,\n DEFAULT_ENVIRONMENT_LIGHTING.sunDirection\n );\n const sunFacing = clamp(dot(normal, sunDirection), 0, 1);\n const skyFacing = 0.35 + clamp(normal[1] * 0.5 + 0.5, 0, 1) * 0.65;\n const directionalWeight = 0.38 + sunFacing * 0.62;\n const sunTint = maxVec3(asVec3(config.environmentLighting?.sunColor, DEFAULT_ENVIRONMENT_LIGHTING.sunColor), [0, 0, 0]);\n return sanitizeWavefrontSampleRadiance(\n sunTint.map((value) => value * baseline * skyFacing * directionalWeight * 0.04)\n );\n}\n\nexport function validateWavefrontBsdfSample({\n hit,\n viewDirection = [0, 1, 0],\n lightDirection = [0, 1, 0],\n sampledPdf,\n lightPdf = 0,\n ambientColor = [0.018, 0.022, 0.026],\n} = {}) {\n const normalizedHit = normalizeWavefrontReferenceHit(hit);\n const normal = normalize(normalizedHit.shadingNormal, [0, 1, 0]);\n const resolvedViewDirection = normalize(viewDirection, normal);\n const resolvedLightDirection = normalize(lightDirection, normal);\n const bsdf = evaluateWavefrontSurfaceBsdfReference(\n normalizedHit,\n resolvedViewDirection,\n resolvedLightDirection,\n ambientColor\n );\n const expectedPdf = evaluateWavefrontSurfaceBsdfPdfReference(\n normalizedHit,\n resolvedViewDirection,\n resolvedLightDirection\n );\n const resolvedSampledPdf =\n sampledPdf === undefined ? expectedPdf : sanitizeWavefrontPdf(sampledPdf);\n const nDotL = clamp(dot(normal, resolvedLightDirection), 0, 1);\n const continuationThroughput =\n resolvedSampledPdf <= 0.000001\n ? [0, 0, 0]\n : sanitizeWavefrontThroughput(\n bsdf.map((value) => value * (nDotL / Math.max(resolvedSampledPdf, 0.000001)))\n );\n const pdfTolerance = Math.max(0.00005, expectedPdf * 0.05);\n return Object.freeze({\n bsdf: Object.freeze(bsdf),\n expectedPdf,\n sampledPdf: resolvedSampledPdf,\n lightPdf: sanitizeWavefrontPdf(lightPdf),\n misWeight: wavefrontPowerHeuristicReference(lightPdf, resolvedSampledPdf),\n continuationThroughput: Object.freeze(continuationThroughput),\n pdfMismatch: Math.abs(resolvedSampledPdf - expectedPdf) > pdfTolerance,\n });\n}\n\nexport function estimateWavefrontDirectionalHemisphericalReflectance(\n hit,\n viewDirection = [0, 1, 0],\n options = {}\n) {\n const normalizedHit = normalizeWavefrontReferenceHit(hit);\n const normal = normalize(normalizedHit.shadingNormal, [0, 1, 0]);\n const resolvedViewDirection = normalize(viewDirection, normal);\n const sampleCount = Math.max(32, readPositiveInteger(\"sampleCount\", options.sampleCount, 512));\n let total = [0, 0, 0];\n for (let index = 0; index < sampleCount; index += 1) {\n const sample = hammersley(index, sampleCount);\n const phi = sample[0] * 2 * Math.PI;\n const cosTheta = sample[1];\n const sinTheta = Math.sqrt(Math.max(1 - cosTheta * cosTheta, 0));\n const lightDirection = localToWorld(\n [Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta],\n normal\n );\n const bsdf = evaluateWavefrontSurfaceBsdfReference(\n normalizedHit,\n resolvedViewDirection,\n lightDirection,\n options.ambientColor ?? [0.018, 0.022, 0.026]\n );\n const nDotL = clamp(dot(normal, lightDirection), 0, 1);\n total = addVec3(total, bsdf.map((value) => value * nDotL * ((2 * Math.PI) / sampleCount)));\n }\n return Object.freeze(clampVec3(total, 0, 4));\n}\n\nexport function computeWavefrontTerminalEnvironmentContributionReference(\n configInput = {},\n rayInput = {},\n throughputInput = [1, 1, 1],\n hitInput = {}\n) {\n const config = configInput ?? {};\n const hit = normalizeWavefrontReferenceHit(hitInput);\n const normal = normalize(hit.shadingNormal, [0, 1, 0]);\n const origin = add(hit.position, scale(normal, 0.003));\n const roughness = clamp(hit.material[0], 0, 1);\n const glossiness = surfaceGlossinessReference(hit);\n const rayDirection = normalize(rayInput.direction ?? [0, -1, 0], [0, -1, 0]);\n const viewDirection = normalize(scale(rayDirection, -1), normal);\n const normalEnvironment = evaluateReferenceEnvironmentRadiance(config, origin, normal).slice(0, 3);\n const reflectionDirection = glossyEnvironmentDirectionReference(\n rayDirection,\n normal,\n roughness,\n mixScalar(0.88, 0.38, glossiness)\n );\n const reflectionEnvironment = evaluateReferenceEnvironmentRadiance(\n config,\n origin,\n reflectionDirection\n ).slice(0, 3);\n const surfaceColor = clampVec3(\n maxVec3(hit.color, scale(asVec3(config.ambientColor, [0.018, 0.022, 0.026]), 0.35)),\n 0,\n 1\n );\n const f0 = surfaceSpecularF0Reference(hit, surfaceColor);\n const [brdfScale, brdfBias] = integrateBrdfSample(\n clamp(dot(normal, viewDirection), 0, 1),\n roughness,\n 128\n );\n const specularEnvironment = multiplyVec3(\n reflectionEnvironment,\n addVec3(scale(f0, brdfScale), [brdfBias, brdfBias, brdfBias])\n );\n const sunlitFloor = sunlitBaselineRadianceReference(config, normal);\n const ambientColor = asVec3(config.ambientColor, [0.018, 0.022, 0.026]);\n const ambientFloor = maxVec3(ambientColor, scale(sunlitFloor, 0.82));\n const environmentInfluence = Math.max(\n 0.12,\n Number(config.environmentLighting?.sunlitBaseline ?? config.pathResolveBaseline ?? 0.16) * 0.42\n );\n const glossyEnvironment = maxVec3(\n normalEnvironment,\n maxVec3(\n scale(reflectionEnvironment, mixScalar(0.24, 0.92, glossiness)),\n specularEnvironment\n )\n );\n const environmentFloor = maxVec3(\n ambientFloor,\n maxVec3(sunlitFloor, scale(glossyEnvironment, environmentInfluence))\n );\n const materialFloor = hit.materialKind === 0 || hit.materialKind === 3 ? 1 : 0.7;\n const source = sanitizeWavefrontSampleRadiance(scale(environmentFloor, materialFloor));\n const occlusion = mixScalar(0.75, 1, clamp(hit.occlusion, 0, 1));\n const contribution = sanitizeWavefrontSampleRadiance(\n scale(\n multiplyVec3(\n multiplyVec3(sanitizeWavefrontThroughput(throughputInput), maxVec3(hit.color, ambientColor)),\n source\n ),\n occlusion\n )\n );\n return Object.freeze({\n source: Object.freeze(source),\n contribution: Object.freeze(contribution),\n });\n}\n","import {\n createGpuParallelismCounters,\n createGpuParallelismDiagnostics,\n createWavefrontTransportGuardrailSummary,\n createGpuWorkerJobDiagnostics,\n} from \"./wavefront-frame-runtime.js\"\nimport { dispatchWavefrontGpuAccelerationBuild } from \"./wavefront-acceleration-builder.js\";\nimport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n} from \"./wavefront-scene-data.js\";\nimport {\n estimateWavefrontPathTracingMemoryForConfig,\n createWavefrontPathTracingComputeConfig,\n packEnvironmentPortals,\n supportsWavefrontPathTracingCompute,\n} from \"./wavefront-config.js\";\nimport {\n clampTileSizeForDevice,\n createAtlasTextureResource,\n createBrdfLutResource,\n createBuffer,\n createEnvironmentMapResource,\n createEnvironmentSamplingTextureResource,\n createMediumTextureResource,\n mediumTablesEqual,\n} from \"./wavefront-gpu-resources.js\";\nimport {\n createConfigPayload,\n createTiles,\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n} from \"./wavefront-packers.js\";\nimport {\n createWavefrontBvhBuildBindGroup,\n createWavefrontDenoiseBindGroups,\n createWavefrontPresentBindGroup,\n createWavefrontTraceBindGroups,\n} from \"./wavefront-bind-groups.js\";\nimport {\n waitForSubmittedGpuWork as waitForSubmittedGpuWorkForDevice,\n} from \"./wavefront-gpu-synchronization.js\";\nimport {\n createWavefrontFrameStats,\n resolveWavefrontRenderedSamplesPerPixel,\n} from \"./wavefront-frame-stats.js\";\nimport {\n createWavefrontFrameTelemetryResources,\n createWavefrontFrameTimingTelemetry,\n createWavefrontRayCountTelemetry,\n} from \"./wavefront-frame-telemetry.js\";\nimport { createWavefrontFrameEncoder } from \"./wavefront-frame-encoder.js\";\nimport {\n dispatchWavefrontFrame,\n dispatchWavefrontFrameAwaitingGpu,\n} from \"./wavefront-frame-dispatcher.js\";\nimport { createWavefrontPipelineResources } from \"./wavefront-pipelines.js\";\nimport {\n readWavefrontOutputProbe,\n readWavefrontTerminationMetrics,\n} from \"./wavefront-readbacks.js\";\nimport {\n createEnvironmentMapSnapshot,\n createGpuAdapterParallelismDiagnostics,\n createWavefrontDeviceDescriptor,\n estimateSubmittedGpuWorkTiming,\n getGpuUsageConstants,\n nowMs,\n resolveCanvas,\n} from \"./wavefront-runtime-support.js\";\n\nimport {\n BVH_NODE_RECORD_BYTES,\n DEFAULT_AMBIENT_COLOR,\n DEFAULT_BRDF_LUT_SAMPLE_COUNT,\n DEFAULT_BRDF_LUT_SIZE,\n DEFAULT_CAMERA,\n DEFAULT_ENVIRONMENT_COLOR,\n DEFAULT_ENVIRONMENT_LIGHTING,\n DEFAULT_ENVIRONMENT_PORTAL_CAPACITY,\n DEFAULT_HEIGHT,\n DEFAULT_MAX_DEPTH,\n DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION,\n DEFAULT_MEDIUM_PHASE_MODEL,\n DEFAULT_SAMPLES_PER_PIXEL,\n DEFAULT_SCENE_OBJECT_CAPACITY,\n DEFAULT_TILE_SIZE,\n DEFAULT_WIDTH,\n EMISSIVE_TRIANGLE_INDEX_BYTES,\n EMPTY_TERMINATION_METRICS,\n GPU_MATERIAL_RECORD_BYTES,\n GPU_MAX_SUBMITTED_WORK_DEADLINE_MS,\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n HIT_TYPE_EMISSIVE,\n HIT_TYPE_SURFACE,\n MATERIAL_DIELECTRIC,\n MATERIAL_DIFFUSE,\n MATERIAL_EMISSIVE,\n MATERIAL_METAL,\n MATERIAL_TRANSPARENT,\n MAX_PATH_TRACING_DEPTH,\n MAX_SAMPLES_PER_PIXEL,\n MEDIUM_TABLE_ROWS,\n OBJECT_KIND_BOX,\n OBJECT_KIND_SPHERE,\n TERMINAL_SOURCE_KIND_AMBIENT_MAX_DEPTH,\n TERMINAL_SOURCE_KIND_AMBIENT_QUEUE_OVERFLOW,\n TERMINAL_SOURCE_KIND_EMISSIVE,\n TERMINAL_SOURCE_KIND_ENVIRONMENT,\n TRACE_STORAGE_BUFFER_BINDINGS,\n add,\n asColor,\n asUnitVec3,\n asVec3,\n assertAnalyticDisplayQualityPolicy,\n boundsCentroid,\n cross,\n dot,\n emissionPower,\n getArrayLikeLength,\n maxComponent,\n mergeBounds,\n mixSeed,\n normalize,\n random01FromSeed,\n readFiniteNumber,\n readVector,\n readVector2,\n resolveDeferredPathResolve,\n resolveEnvironmentMap,\n resolveSheenColor,\n scale,\n subtract,\n triangleBounds,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-core.js\";\n\nfunction triangleAreaForLightSampling(triangle) {\n if (!triangle) {\n return 1;\n }\n const edge1 = subtract(triangle.v1, triangle.v0);\n const edge2 = subtract(triangle.v2, triangle.v0);\n return Math.max(Math.hypot(...cross(edge1, edge2)) * 0.5, 0.000001);\n}\n\nfunction emissiveTriangleWeight(triangle) {\n if (!triangle) {\n return 1;\n }\n return triangleAreaForLightSampling(triangle) * Math.max(emissionPower(triangle.emission), 0.000001);\n}\n\nfunction resolveOrderedEmissiveTriangleIndices(config) {\n const triangleIndexById = new Map(\n config.meshAcceleration.triangles.map((triangle, index) => [triangle.triangleId, index])\n );\n return config.emissiveTriangleIndices.indices\n .map((triangleId) => triangleIndexById.get(triangleId))\n .filter((triangleIndex) => Number.isInteger(triangleIndex));\n}\n\nexport async function createWavefrontPathTracingComputeRenderer(options = {}) {\n assertAnalyticDisplayQualityPolicy(options);\n const constants = getGpuUsageConstants();\n const navigatorRef = options.navigator ?? globalThis.navigator;\n if (!supportsWavefrontPathTracingCompute({ navigator: navigatorRef })) {\n throw new Error(\"WebGPU wavefront path tracing requires navigator.gpu.\");\n }\n\n const canvas = resolveCanvas(options.canvas, options.document);\n const initialConfig = createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n });\n const adapter = await navigatorRef.gpu.requestAdapter({\n powerPreference: options.powerPreference ?? \"high-performance\",\n });\n if (!adapter) {\n throw new Error(\"Unable to acquire a WebGPU adapter for wavefront path tracing.\");\n }\n\n const device = await adapter.requestDevice(\n createWavefrontDeviceDescriptor(adapter, options, initialConfig.memory)\n );\n const gpuAdapterParallelism = createGpuAdapterParallelismDiagnostics(adapter, device);\n const context = canvas.getContext(\"webgpu\");\n if (!context || typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n\n const format =\n options.format ??\n (typeof navigatorRef.gpu.getPreferredCanvasFormat === \"function\"\n ? navigatorRef.gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n let config = initialConfig;\n const safeTileSize = clampTileSizeForDevice(config, device);\n if (safeTileSize !== config.tileSize) {\n config = createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n width: config.width,\n height: config.height,\n tileSize: safeTileSize,\n tilePixelCapacity: Math.min(\n config.tilePixelCapacity,\n safeTileSize * safeTileSize\n ),\n });\n }\n config = Object.freeze({\n ...config,\n memory: estimateWavefrontPathTracingMemoryForConfig(config, device.limits),\n });\n canvas.width = config.width;\n canvas.height = config.height;\n context.configure({\n device,\n format,\n alphaMode: options.alpha === true ? \"premultiplied\" : \"opaque\",\n });\n\n const bufferUsage = constants.buffer.STORAGE | constants.buffer.COPY_DST;\n const memory = config.memory;\n const activeQueue = createBuffer(device, bufferUsage, memory.queueBytes, \"plasius.wavefront.activeQueue\");\n const nextQueue = createBuffer(device, bufferUsage, memory.queueBytes, \"plasius.wavefront.nextQueue\");\n const hitBuffer = createBuffer(device, bufferUsage, memory.hitBytes, \"plasius.wavefront.hitBuffer\");\n const accumulationBuffer = createBuffer(\n device,\n bufferUsage,\n memory.accumulationBytes,\n \"plasius.wavefront.accumulation\"\n );\n const pathVertexBuffer = createBuffer(\n device,\n bufferUsage,\n memory.pathVertexBytes,\n \"plasius.wavefront.pathVertices\"\n );\n const sceneObjectBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.sceneObjectBytes,\n \"plasius.wavefront.sceneObjects\"\n );\n const triangleBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.triangleBytes,\n \"plasius.wavefront.triangles\"\n );\n const bvhNodeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.bvhCombinedBytes,\n \"plasius.wavefront.bvhNodes\"\n );\n const meshVertexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshVertexBytes,\n \"plasius.wavefront.meshVertices\"\n );\n const meshIndexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshIndexBytes,\n \"plasius.wavefront.meshIndices\"\n );\n const meshRangeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.meshRangeBytes,\n \"plasius.wavefront.meshRanges\"\n );\n const environmentPortalBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.environmentPortalBytes,\n \"plasius.wavefront.environmentPortals\"\n );\n const bvhLeafRefBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n memory.bvhLeafReferenceBytes,\n \"plasius.wavefront.bvhLeafRefs\"\n );\n const tiles = createTiles(config.width, config.height, config.tileSize);\n const configBufferStride = memory.configBufferStride;\n const outputConfigSlotCount = config.deferredPathResolve ? 0 : tiles.length;\n const frameConfigSlotCount = Math.max(\n 1,\n tiles.length * config.samplesPerPixel + outputConfigSlotCount + (config.denoise ? 1 : 0)\n );\n const configBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n memory.frameConfigBytes,\n \"plasius.wavefront.frameConfig\"\n );\n const bvhBuildConfigBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n memory.bvhBuildConfigBytes,\n \"plasius.wavefront.bvhBuildConfig\"\n );\n const counterBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n memory.counterBytes,\n \"plasius.wavefront.counters\"\n );\n const activeDispatchBuffer = createBuffer(\n device,\n constants.buffer.INDIRECT | constants.buffer.COPY_DST,\n memory.indirectDispatchBytes,\n \"plasius.wavefront.activeDispatchArgs\"\n );\n\n let packedScene = packWavefrontSceneObjects(config.sceneObjects, config.sceneObjectCapacity);\n device.queue.writeBuffer(sceneObjectBuffer, 0, packedScene.buffer);\n const packedTriangles = packWavefrontTriangles(\n config.meshAcceleration.triangles,\n Math.max(1, config.triangleCapacity)\n );\n const packedBvhNodes = packWavefrontBvhNodes(\n config.meshAcceleration.nodes,\n Math.max(1, config.bvhNodeCapacity + config.emissiveTriangleCapacity)\n );\n const packedBvhNodeUints = new Uint32Array(packedBvhNodes.buffer);\n const packedBvhNodeFloats = new Float32Array(packedBvhNodes.buffer);\n const orderedEmissiveTriangleIndices = resolveOrderedEmissiveTriangleIndices(config);\n const emissiveWeights = orderedEmissiveTriangleIndices.map((triangleIndex) =>\n emissiveTriangleWeight(config.meshAcceleration.triangles[triangleIndex])\n );\n const totalEmissiveWeight = emissiveWeights.reduce((total, weight) => total + weight, 0);\n let cumulativeEmissiveWeight = 0;\n orderedEmissiveTriangleIndices.forEach((triangleIndex, index) => {\n const nodeOffset = (config.bvhNodeCapacity + index) * (BVH_NODE_RECORD_BYTES / 4);\n cumulativeEmissiveWeight += emissiveWeights[index] ?? 0;\n packedBvhNodeFloats[nodeOffset] = cumulativeEmissiveWeight;\n packedBvhNodeFloats[nodeOffset + 1] = emissiveWeights[index] ?? 0;\n packedBvhNodeFloats[nodeOffset + 2] = totalEmissiveWeight;\n packedBvhNodeUints[nodeOffset + 8] = triangleIndex;\n });\n device.queue.writeBuffer(triangleBuffer, 0, packedTriangles.buffer);\n device.queue.writeBuffer(bvhNodeBuffer, 0, packedBvhNodes.buffer);\n device.queue.writeBuffer(meshVertexBuffer, 0, config.gpuMeshSource.vertices.buffer);\n device.queue.writeBuffer(meshIndexBuffer, 0, config.gpuMeshSource.indices.buffer);\n device.queue.writeBuffer(meshRangeBuffer, 0, config.gpuMeshSource.meshes.buffer);\n const packedEnvironmentPortals = packEnvironmentPortals(\n config.environmentPortals,\n Math.max(1, config.environmentPortalCapacity)\n );\n device.queue.writeBuffer(environmentPortalBuffer, 0, packedEnvironmentPortals.buffer);\n\n const radianceTexture = device.createTexture({\n label: \"plasius.wavefront.radiance\",\n size: { width: config.width, height: config.height },\n format: \"rgba16float\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING,\n });\n const radianceView = radianceTexture.createView();\n const denoiseScratchTexture = device.createTexture({\n label: \"plasius.wavefront.denoiseScratch\",\n size: { width: config.width, height: config.height },\n format: \"rgba16float\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING,\n });\n const denoiseScratchView = denoiseScratchTexture.createView();\n const outputTexture = device.createTexture({\n label: \"plasius.wavefront.output\",\n size: { width: config.width, height: config.height },\n format: \"rgba8unorm\",\n usage:\n constants.texture.STORAGE_BINDING |\n constants.texture.TEXTURE_BINDING |\n constants.texture.COPY_SRC,\n });\n const outputView = outputTexture.createView();\n const sampler = device.createSampler({\n label: \"plasius.wavefront.presentSampler\",\n magFilter: \"nearest\",\n minFilter: \"nearest\",\n });\n const environmentMapResource = createEnvironmentMapResource(\n device,\n constants,\n config.environmentMap,\n config.environmentColor\n );\n const environmentSamplingResource = createEnvironmentSamplingTextureResource(\n device,\n constants,\n config.environmentMap,\n config.environmentColor\n );\n let mediumTextureResource = createMediumTextureResource(\n device,\n constants,\n config.mediums\n );\n config = Object.freeze({\n ...config,\n environmentMap: Object.freeze({\n ...config.environmentMap,\n width: environmentMapResource.width,\n height: environmentMapResource.height,\n mipLevelCount: environmentMapResource.mipLevelCount,\n hasImportanceData: environmentSamplingResource.hasImportanceData,\n }),\n });\n const brdfLutResource = createBrdfLutResource(device, constants);\n const baseColorAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.baseColorAtlas,\n \"plasius.wavefront.materialAtlas.baseColor\"\n );\n const metallicRoughnessAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.metallicRoughnessAtlas,\n \"plasius.wavefront.materialAtlas.metallicRoughness\"\n );\n const normalAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.normalAtlas,\n \"plasius.wavefront.materialAtlas.normal\"\n );\n const occlusionAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.occlusionAtlas,\n \"plasius.wavefront.materialAtlas.occlusion\"\n );\n const emissiveAtlasResource = createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.emissiveAtlas,\n \"plasius.wavefront.materialAtlas.emissive\"\n );\n const extensionAtlasNames = [\n \"clearcoat\",\n \"clearcoatRoughness\",\n \"clearcoatNormal\",\n \"transmission\",\n \"thickness\",\n \"sheenColor\",\n \"sheenRoughness\",\n \"specular\",\n \"specularColor\",\n \"iridescence\",\n \"iridescenceThickness\",\n \"anisotropy\",\n ];\n const extensionAtlasResources = Object.freeze(\n Object.fromEntries(\n extensionAtlasNames.map((name) => [\n name,\n createAtlasTextureResource(\n device,\n constants,\n config.gpuMaterialSource.extensionAtlases[name],\n `plasius.wavefront.materialAtlas.${name}`\n ),\n ])\n )\n );\n const materialAtlasSampler = device.createSampler({\n label: \"plasius.wavefront.materialAtlasSampler\",\n addressModeU: \"clamp-to-edge\",\n addressModeV: \"clamp-to-edge\",\n magFilter: \"linear\",\n minFilter: \"linear\",\n });\n\n const {\n bindGroupLayouts: {\n trace: traceBindGroupLayout,\n acceleration: accelerationBindGroupLayout,\n denoiseRadiance: denoiseRadianceBindGroupLayout,\n denoiseResolve: denoiseResolveBindGroupLayout,\n present: presentBindGroupLayout,\n },\n computePipelines: pipelines,\n presentPipeline,\n } = await createWavefrontPipelineResources({ device, constants, format });\n\n function createTraceBindGroups() {\n return createWavefrontTraceBindGroups({\n device,\n traceBindGroupLayout,\n activeQueue,\n nextQueue,\n frameConfigBuffer: configBuffer,\n hitBuffer,\n accumulationBuffer,\n sceneObjectBuffer,\n counterBuffer,\n outputView,\n triangleBuffer,\n bvhNodeBuffer,\n radianceView,\n environmentPortalBuffer,\n environmentMapResource,\n pathVertexBuffer,\n baseColorAtlasResource,\n metallicRoughnessAtlasResource,\n normalAtlasResource,\n occlusionAtlasResource,\n emissiveAtlasResource,\n materialAtlasSampler,\n brdfLutResource,\n environmentSamplingResource,\n mediumTextureResource,\n extensionAtlasResources,\n });\n }\n\n let bindGroups = createTraceBindGroups();\n const bvhBuildBindGroup = createWavefrontBvhBuildBindGroup({\n device,\n accelerationBindGroupLayout,\n bvhBuildConfigBuffer,\n triangleBuffer,\n bvhNodeBuffer,\n meshVertexBuffer,\n meshIndexBuffer,\n meshRangeBuffer,\n bvhLeafRefBuffer,\n });\n const {\n radiance: denoiseRadianceBindGroup,\n resolve: denoiseResolveBindGroup,\n directResolve: denoiseDirectResolveBindGroup,\n } = createWavefrontDenoiseBindGroups({\n device,\n denoiseRadianceBindGroupLayout,\n denoiseResolveBindGroupLayout,\n configBuffer,\n radianceView,\n denoiseScratchView,\n outputView,\n });\n const presentBindGroup = createWavefrontPresentBindGroup({\n device,\n presentBindGroupLayout,\n outputView,\n sampler,\n });\n let activeFrameTelemetry = null;\n let frameTelemetryResources = null;\n const frameEncoder = createWavefrontFrameEncoder({\n getConfig: () => config,\n getBindGroups: () => bindGroups,\n pipelines,\n counterBuffer,\n activeDispatchBuffer,\n denoiseRadianceBindGroup,\n denoiseResolveBindGroup,\n denoiseDirectResolveBindGroup,\n presentPipeline,\n presentBindGroup,\n context,\n getFrameTelemetry: () => activeFrameTelemetry,\n });\n\n let frame = 0;\n let accelerationBuilt = !config.gpuAccelerationBuildRequired;\n let accelerationBuildCount = 0;\n let activeCameraOptions = options.camera ?? DEFAULT_CAMERA;\n let lastCompletedFrameTimeMs = null;\n let lastCompletedSamplesPerPixel = Math.max(1, config.samplesPerPixel);\n let lastGpuParallelism = createGpuParallelismDiagnostics(\n gpuAdapterParallelism,\n createGpuParallelismCounters()\n );\n const waitForSubmittedGpuWork = (waitOptions = {}) =>\n waitForSubmittedGpuWorkForDevice(device, waitOptions);\n\n function ensureFrameTelemetryResources() {\n if (!frameTelemetryResources) {\n frameTelemetryResources = createWavefrontFrameTelemetryResources({\n device,\n constants,\n maxRayCountRecords:\n tiles.length * config.samplesPerPixel * config.maxDepth,\n });\n }\n return frameTelemetryResources;\n }\n\n function resolveRenderedSamplesPerPixel(renderOptions = {}, awaitGPUCompletion = true) {\n return resolveWavefrontRenderedSamplesPerPixel({\n config,\n renderOptions,\n awaitGPUCompletion,\n lastCompletedFrameTimeMs,\n lastCompletedSamplesPerPixel,\n });\n }\n\n function createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n }) {\n const stats = createWavefrontFrameStats({\n config,\n tiles,\n frame,\n frameIndex,\n accelerationBuilt,\n accelerationBuildCount,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n frameConfigSlotCount,\n gpuAdapterParallelism,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n });\n lastGpuParallelism = stats.gpuParallelism;\n return stats.frameStats;\n }\n\n async function readTerminationMetrics() {\n return readWavefrontTerminationMetrics({\n device,\n constants,\n counterBuffer,\n waitForSubmittedGpuWork,\n });\n }\n\n function writeFrameConfigSlot(slot, tile, frameIndex, buildRange = {}) {\n if (slot >= frameConfigSlotCount) {\n throw new Error(\"Wavefront frame config slot capacity exceeded.\");\n }\n const offset = slot * configBufferStride;\n device.queue.writeBuffer(\n configBuffer,\n offset,\n createConfigPayload(config, tile, frameIndex, buildRange)\n );\n return offset;\n }\n\n function createFrameConfigWriter(frameIndex) {\n let slot = 0;\n return (tile, buildRange = {}) => {\n const offset = writeFrameConfigSlot(slot, tile, frameIndex, buildRange);\n slot += 1;\n return offset;\n };\n }\n\n function dispatchGpuAccelerationBuild(frameIndex, parallelism) {\n const submitted = dispatchWavefrontGpuAccelerationBuild({\n config,\n accelerationBuilt,\n tiles,\n device,\n bvhBuildConfigBuffer,\n configBufferStride,\n bvhBuildBindGroup,\n pipelines,\n parallelism,\n frameIndex,\n });\n if (submitted) {\n accelerationBuilt = true;\n accelerationBuildCount += 1;\n }\n return submitted;\n }\n\n function dispatchFrame(frameIndex, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\n return dispatchWavefrontFrame({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel,\n frameEncoder,\n createFrameConfigWriter,\n });\n }\n\n function renderOnce(renderOptions = {}, resolvedSamplingPlan = null) {\n const frameStartTimeMs = nowMs();\n frame += 1;\n const frameIndex = frame + config.frameIndex;\n const samplingPlan = resolvedSamplingPlan ?? resolveRenderedSamplesPerPixel(renderOptions, false);\n const parallelismCounters = createGpuParallelismCounters();\n const accelerationBuildSubmitted = dispatchGpuAccelerationBuild(frameIndex, parallelismCounters);\n const frameSubmissionCount = dispatchFrame(\n frameIndex,\n parallelismCounters,\n samplingPlan.renderedSamplesPerPixel\n );\n const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n return Object.freeze({\n ...createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel,\n targetSamplesPerPixel: samplingPlan.targetSamplesPerPixel,\n frameTimeBudgetMs: samplingPlan.frameTimeBudgetMs,\n budgetConstrained: samplingPlan.budgetConstrained,\n }),\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n lastGpuParallelism,\n frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0),\n frameTimeMs,\n false\n ),\n timings: createWavefrontFrameTimingTelemetry({\n status: \"not-requested\",\n source: \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n }),\n });\n }\n\n function dispatchFrameAwaitingGpu(\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\n optionsForFrame = {}\n ) {\n return dispatchWavefrontFrameAwaitingGpu({\n config,\n tiles,\n device,\n frameIndex,\n parallelism,\n renderedSamplesPerPixel,\n frameEncoder,\n writeFrameConfigSlot,\n optionsForFrame,\n });\n }\n\n async function readOutputProbe(optionsForProbe = {}) {\n return readWavefrontOutputProbe({\n device,\n constants,\n config,\n outputTexture,\n waitForSubmittedGpuWork,\n optionsForProbe,\n });\n }\n\n async function renderFrame(renderOptions = {}) {\n const awaitGPUCompletion = renderOptions.awaitGPUCompletion !== false;\n const samplingPlan = resolveRenderedSamplesPerPixel(renderOptions, awaitGPUCompletion);\n const useThrottledHighSamplePath =\n awaitGPUCompletion && samplingPlan.renderedSamplesPerPixel >= 8;\n const telemetryRequested = renderOptions.readStats === true;\n const telemetryCanRecord = telemetryRequested && awaitGPUCompletion;\n const telemetryResourcesForFrame = telemetryCanRecord\n ? ensureFrameTelemetryResources()\n : null;\n if (telemetryResourcesForFrame?.available) {\n telemetryResourcesForFrame.beginFrame();\n activeFrameTelemetry = telemetryResourcesForFrame;\n }\n const frameStartTimeMs = nowMs();\n let frameStats;\n try {\n if (useThrottledHighSamplePath) {\n frame += 1;\n const frameIndex = frame + config.frameIndex;\n const parallelismCounters = createGpuParallelismCounters();\n const accelerationBuildSubmitted = dispatchGpuAccelerationBuild(frameIndex, parallelismCounters);\n let frameSubmissionCount = 0;\n let frameConfigSlot = 0;\n if (accelerationBuildSubmitted) {\n const accelerationWaitOptions = {\n ...estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: 1 },\n 1,\n renderOptions.submittedWorkTimeoutMs,\n { includeAccelerationBuild: true }\n ),\n allowTimeout: false,\n };\n await waitForSubmittedGpuWork(accelerationWaitOptions);\n }\n for (let tileIndex = 0; tileIndex < tiles.length; tileIndex += 1) {\n const tileRangeDispatch = dispatchFrameAwaitingGpu(\n frameIndex,\n parallelismCounters,\n samplingPlan.renderedSamplesPerPixel,\n {\n sampleRangeStart: 0,\n sampleRangeEnd: samplingPlan.renderedSamplesPerPixel,\n tileStartIndex: tileIndex,\n tileEndIndex: tileIndex + 1,\n startingSubmissionCount: frameSubmissionCount,\n startingSlot: frameConfigSlot,\n includeDenoise: tileIndex + 1 >= tiles.length,\n includePresent: tileIndex + 1 >= tiles.length,\n }\n );\n frameSubmissionCount = tileRangeDispatch.submissionCount;\n frameConfigSlot = tileRangeDispatch.slot;\n const tileWaitOptions = {\n ...estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel },\n 1,\n renderOptions.submittedWorkTimeoutMs,\n {\n includeDenoise: tileIndex + 1 >= tiles.length && config.denoise,\n includePresent: tileIndex + 1 >= tiles.length,\n }\n ),\n allowTimeout: false,\n };\n await waitForSubmittedGpuWork(tileWaitOptions);\n }\n frameStats = createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel,\n targetSamplesPerPixel: samplingPlan.targetSamplesPerPixel,\n frameTimeBudgetMs: samplingPlan.frameTimeBudgetMs,\n budgetConstrained: samplingPlan.budgetConstrained,\n });\n } else {\n const submittedWorkTiming = estimateSubmittedGpuWorkTiming(\n { ...config, renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel },\n tiles.length,\n renderOptions.submittedWorkTimeoutMs,\n { includeAccelerationBuild: config.gpuAccelerationBuildRequired && !accelerationBuilt }\n );\n const submissionWaitOptions = awaitGPUCompletion\n ? {\n timeoutMs: submittedWorkTiming.timeoutMs,\n maxWaitMs: submittedWorkTiming.maxWaitMs,\n allowTimeout: false,\n }\n : {\n timeoutMs: submittedWorkTiming.timeoutMs,\n maxWaitMs: submittedWorkTiming.maxWaitMs,\n };\n frameStats = renderOnce(renderOptions, samplingPlan);\n if (awaitGPUCompletion) {\n await waitForSubmittedGpuWork(submissionWaitOptions);\n }\n }\n } finally {\n activeFrameTelemetry = null;\n }\n const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n if (awaitGPUCompletion) {\n lastCompletedFrameTimeMs = frameTimeMs;\n lastCompletedSamplesPerPixel = frameStats.renderedSamplesPerPixel ?? frameStats.samplesPerPixel;\n }\n const expectedPrimaryRays =\n config.width * config.height * samplingPlan.renderedSamplesPerPixel;\n const expectedRayCounts =\n tiles.length * samplingPlan.renderedSamplesPerPixel * config.maxDepth;\n const telemetryReadback = telemetryCanRecord\n ? await telemetryResourcesForFrame.readFrame({\n expectedPrimaryRays,\n expectedRayCounts,\n waitForSubmittedGpuWork,\n })\n : null;\n const rayCounts = !telemetryRequested\n ? createWavefrontRayCountTelemetry()\n : !awaitGPUCompletion\n ? createWavefrontRayCountTelemetry({\n status: \"unavailable\",\n expectedPrimaryRays,\n expectedRayCounts,\n reason: \"gpu-work-not-awaited\",\n })\n : telemetryReadback.rayCounts;\n const timings = !telemetryRequested\n ? createWavefrontFrameTimingTelemetry({\n status: \"not-requested\",\n source: awaitGPUCompletion ? \"queue-completion\" : \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n })\n : !awaitGPUCompletion\n ? createWavefrontFrameTimingTelemetry({\n status: \"unavailable\",\n source: \"cpu-submit\",\n timestampQueryStatus: \"not-recorded\",\n totalRenderJobTimeMs: frameTimeMs,\n reason: \"gpu-work-not-awaited\",\n })\n : telemetryReadback.timestampQueryStatus === \"available\"\n ? createWavefrontFrameTimingTelemetry({\n status: \"available\",\n source: \"timestamp-query\",\n timestampQueryStatus: \"available\",\n totalGpuTimeMs: telemetryReadback.totalGpuTimeMs,\n totalRenderJobTimeMs: frameTimeMs,\n })\n : createWavefrontFrameTimingTelemetry({\n status: \"fallback\",\n source: \"queue-completion\",\n timestampQueryStatus: telemetryReadback.timestampQueryStatus,\n totalRenderJobTimeMs: frameTimeMs,\n reason: telemetryReadback.reason,\n });\n const deviceLossStatus =\n awaitGPUCompletion\n ? \"not-detected\"\n : typeof device.lost?.then === \"function\"\n ? \"pending\"\n : \"not-exposed\";\n frameStats = Object.freeze({\n ...frameStats,\n deviceLossStatus,\n secondaryRays:\n rayCounts.status === \"available\" ? rayCounts.secondaryRays : null,\n totalPathSegments:\n rayCounts.status === \"available\" ? rayCounts.totalPathSegments : null,\n rayCounts,\n timings,\n telemetryMemoryBytes: telemetryResourcesForFrame?.memoryBytes ?? 0,\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n frameStats.gpuParallelism,\n frameStats.commandSubmissions,\n frameTimeMs,\n awaitGPUCompletion\n ),\n });\n const terminationMetrics = awaitGPUCompletion && renderOptions.readStats === true\n ? await readTerminationMetrics()\n : EMPTY_TERMINATION_METRICS;\n const probe =\n renderOptions.readOutputProbe === false ? null : await readOutputProbe(renderOptions.probe);\n const maxChannel = probe ? Math.max(...probe.rgba.slice(0, 3)) : 0;\n const completedFrame = Object.freeze({\n ...frameStats,\n outputProbe: probe\n ? Object.freeze({\n ...probe,\n sampledPixels: 1,\n nonZeroSamples: maxChannel > 0 ? 1 : 0,\n maxChannel,\n })\n : null,\n bounces: [],\n termination: terminationMetrics.termination,\n terminalRadiance: terminationMetrics.terminalRadiance,\n radianceDiagnostics: terminationMetrics.radianceDiagnostics,\n transportContributions: terminationMetrics.transportContributions,\n queueOverflow: terminationMetrics.queueOverflow,\n });\n return Object.freeze({\n ...completedFrame,\n transportGuardrails: createWavefrontTransportGuardrailSummary(completedFrame),\n });\n }\n\n function rebuildLiveConfig(overrides = {}) {\n return createWavefrontPathTracingComputeConfig({\n ...options,\n canvas,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n sceneObjectCapacity: config.sceneObjectCapacity,\n sceneObjects: packedScene.objects,\n camera: activeCameraOptions,\n environmentMap: {\n ...config.environmentMap,\n },\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n featureFlags: options.featureFlags,\n frameIndex: config.frameIndex,\n ...overrides,\n });\n }\n\n function rebuildMediumResources(nextConfig) {\n const previousMediumTextureResource = mediumTextureResource;\n mediumTextureResource = createMediumTextureResource(device, constants, nextConfig.mediums);\n bindGroups = createTraceBindGroups();\n if (previousMediumTextureResource?.ownsTexture) {\n previousMediumTextureResource.texture?.destroy?.();\n }\n }\n\n function updateSceneObjects(sceneObjects) {\n const nextPackedScene = packWavefrontSceneObjects(sceneObjects, config.sceneObjectCapacity);\n packedScene = nextPackedScene;\n const nextConfig = rebuildLiveConfig();\n if (!mediumTablesEqual(config.mediums, nextConfig.mediums)) {\n rebuildMediumResources(nextConfig);\n }\n config = nextConfig;\n device.queue.writeBuffer(sceneObjectBuffer, 0, packedScene.buffer);\n return config;\n }\n\n function updateCamera(cameraOptions = {}) {\n activeCameraOptions = cameraOptions;\n config = rebuildLiveConfig();\n return config;\n }\n\n function getSnapshot() {\n return Object.freeze({\n frame,\n width: config.width,\n height: config.height,\n maxDepth: config.maxDepth,\n tiles: tiles.length,\n tileSize: config.tileSize,\n samplesPerPixel: config.samplesPerPixel,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n sceneObjectCount: config.sceneObjectCount,\n triangleCount: config.triangleCount,\n emissiveTriangleCount: config.emissiveTriangleCount,\n environmentPortalCount: config.environmentPortalCount,\n environmentPortalMode: config.environmentPortalMode,\n mediumCount: config.mediumCount,\n environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\n strictPhysicalLowSppLighting: config.strictPhysicalLowSppLighting,\n transportExperiments: config.transportExperiments,\n transportExperimentFlags: config.transportExperimentFlags,\n bvhNodeCount: config.bvhNodeCount,\n displayQuality: config.displayQuality,\n accelerationBuildMode: config.accelerationBuildMode,\n gpuAccelerationBuildRequired: config.gpuAccelerationBuildRequired,\n accelerationBuilt,\n accelerationBuildCount,\n frameConfigSlots: frameConfigSlotCount,\n gpuParallelism: lastGpuParallelism,\n memory: config.memory,\n });\n }\n\n function destroy() {\n frameTelemetryResources?.destroy?.();\n activeQueue.destroy?.();\n nextQueue.destroy?.();\n hitBuffer.destroy?.();\n accumulationBuffer.destroy?.();\n pathVertexBuffer.destroy?.();\n sceneObjectBuffer.destroy?.();\n triangleBuffer.destroy?.();\n bvhNodeBuffer.destroy?.();\n meshVertexBuffer.destroy?.();\n meshIndexBuffer.destroy?.();\n meshRangeBuffer.destroy?.();\n environmentPortalBuffer.destroy?.();\n bvhLeafRefBuffer.destroy?.();\n configBuffer.destroy?.();\n bvhBuildConfigBuffer.destroy?.();\n counterBuffer.destroy?.();\n activeDispatchBuffer.destroy?.();\n radianceTexture.destroy?.();\n denoiseScratchTexture.destroy?.();\n outputTexture.destroy?.();\n if (environmentMapResource.ownsTexture) {\n environmentMapResource.texture?.destroy?.();\n }\n if (environmentSamplingResource.ownsTexture) {\n environmentSamplingResource.texture?.destroy?.();\n }\n if (mediumTextureResource.ownsTexture) {\n mediumTextureResource.texture?.destroy?.();\n }\n brdfLutResource.texture?.destroy?.();\n if (baseColorAtlasResource.ownsTexture) {\n baseColorAtlasResource.texture?.destroy?.();\n }\n if (metallicRoughnessAtlasResource.ownsTexture) {\n metallicRoughnessAtlasResource.texture?.destroy?.();\n }\n if (normalAtlasResource.ownsTexture) {\n normalAtlasResource.texture?.destroy?.();\n }\n if (occlusionAtlasResource.ownsTexture) {\n occlusionAtlasResource.texture?.destroy?.();\n }\n if (emissiveAtlasResource.ownsTexture) {\n emissiveAtlasResource.texture?.destroy?.();\n }\n Object.values(extensionAtlasResources).forEach((resource) => {\n if (resource.ownsTexture) {\n resource.texture?.destroy?.();\n }\n });\n context.unconfigure?.();\n }\n\n return Object.freeze({\n canvas,\n context,\n device,\n format,\n config,\n renderOnce,\n renderFrame,\n readOutputProbe,\n updateSceneObjects,\n updateCamera,\n getSnapshot,\n destroy,\n });\n}\n\nexport async function renderWavefrontPathTracingComputeFrame(options = {}) {\n const renderer = await createWavefrontPathTracingComputeRenderer(options);\n try {\n return await renderer.renderFrame(options);\n } finally {\n renderer.destroy();\n }\n}\n\nexport { createWavefrontPathTracingComputeShaderSource } from \"./wavefront-shaders.js\";\nexport {\n computeWavefrontTerminalEnvironmentContributionReference,\n createWavefrontReferenceRay,\n estimateWavefrontDirectionalHemisphericalReflectance,\n intersectWavefrontReferenceTriangle,\n traceWavefrontReferenceTriangles,\n validateWavefrontBsdfSample,\n} from \"./wavefront-reference.js\";\nexport {\n createDefaultWavefrontSceneObjects,\n createWavefrontBvhBuildLevels,\n createWavefrontBvhSortStages,\n createWavefrontEmissiveTriangleIndexSource,\n createWavefrontGpuMaterialSource,\n createWavefrontGpuMeshSource,\n createWavefrontMeshAcceleration,\n normalizeWavefrontMesh,\n normalizeWavefrontSceneObject,\n} from \"./wavefront-scene-data.js\";\nexport {\n createWavefrontPathTracingComputeConfig,\n estimateWavefrontPathTracingMemory,\n supportsWavefrontPathTracingCompute,\n} from \"./wavefront-config.js\";\nexport {\n packWavefrontBvhNodes,\n packWavefrontSceneObjects,\n packWavefrontTriangles,\n} from \"./wavefront-packers.js\";\nexport {\n rendererWavefrontComputeMode,\n rendererWavefrontComputeStatsStride,\n rendererWavefrontComputeWorkgroupSize,\n wavefrontMaterialKinds,\n wavefrontPathTracingComputeLimits,\n wavefrontSceneObjectKinds,\n} from \"./wavefront-core.js\";\n","import {\n rendererDebugOwner,\n rendererWavefrontBufferSchemaVersion,\n rendererWavefrontHitTypes,\n rendererWavefrontPassOrder,\n rendererWavefrontQueuePairStrategy,\n} from \"./renderer-constants.js\";\nimport { readNonNegativeInteger, readPositiveInteger } from \"./renderer-validation.js\";\n\nfunction clampWavefrontAdaptiveSamplesPerPixel(value) {\n if (!Number.isFinite(value)) {\n return 1;\n }\n return Math.max(1, Math.min(256, Math.round(value)));\n}\n\nexport function createWavefrontAdaptiveSamplingLevels(options = {}) {\n const requestedSamplesPerPixel = clampWavefrontAdaptiveSamplesPerPixel(\n options.samplesPerPixel ?? 1\n );\n const minimumSamplesPerPixel = Math.min(\n requestedSamplesPerPixel,\n clampWavefrontAdaptiveSamplesPerPixel(options.minimumSamplesPerPixel ?? 1)\n );\n const frameTimeBudgetMs = Number.isFinite(options.frameTimeBudgetMs)\n ? Math.max(0, Number(options.frameTimeBudgetMs))\n : 0;\n const levels = new Set([minimumSamplesPerPixel, requestedSamplesPerPixel]);\n let currentSamplesPerPixel = minimumSamplesPerPixel;\n\n while (currentSamplesPerPixel < requestedSamplesPerPixel) {\n levels.add(currentSamplesPerPixel);\n currentSamplesPerPixel *= 2;\n }\n\n levels.add(Math.min(currentSamplesPerPixel, requestedSamplesPerPixel));\n\n return Object.freeze({\n requestedSamplesPerPixel,\n minimumSamplesPerPixel,\n frameTimeBudgetMs,\n levels: Object.freeze(\n [...levels]\n .sort((left, right) => left - right)\n .map((samplesPerPixel) =>\n Object.freeze({\n id: `${samplesPerPixel}spp`,\n label: `${samplesPerPixel} spp`,\n estimatedCostMs: samplesPerPixel,\n config: Object.freeze({\n samplesPerPixel,\n frameTimeBudgetMs,\n minimumSamplesPerPixel,\n }),\n })\n )\n ),\n });\n}\n\nfunction createWavefrontField(name, type, description) {\n return Object.freeze({\n name,\n type,\n description,\n });\n}\n\nconst rendererWavefrontBufferContracts = Object.freeze({\n ray: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"RayRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Stable ray identifier for correlation and debugging.\"),\n createWavefrontField(\"parentRayId\", \"u32\", \"Parent ray identifier for continuation lineage.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel that owns the sample.\"),\n createWavefrontField(\"sampleId\", \"u32\", \"Per-pixel sample slot for accumulation.\"),\n createWavefrontField(\"bounce\", \"u32\", \"Breadth-first bounce depth for the queue entry.\"),\n createWavefrontField(\"origin\", \"vec3<f32>\", \"Ray origin in renderer world space.\"),\n createWavefrontField(\"direction\", \"vec3<f32>\", \"Normalized ray direction in renderer world space.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Current physical path throughput before the next event.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Active medium reference identifier for the ray.\"),\n createWavefrontField(\"flags\", \"u32\", \"Bit flags for front-face state, debug, and quality toggles.\"),\n ]),\n }),\n hit: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"HitRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier copied from the active queue.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Pixel/texel owner for the ray sample.\"),\n createWavefrontField(\"hitType\", rendererWavefrontHitTypes.join(\" | \"), \"Resolved hit classification for termination or continuation.\"),\n createWavefrontField(\"distance\", \"f32\", \"Nearest-hit distance or miss sentinel.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"instanceId\", \"u32\", \"Renderer instance identifier.\"),\n createWavefrontField(\"primitiveId\", \"u32\", \"Primitive or triangle identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Surface material identifier.\"),\n createWavefrontField(\"barycentrics\", \"vec3<f32>\", \"Triangle barycentric coordinates for interpolation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved surface UV when available.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"True geometric face normal.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Interpolated or repaired shading normal.\"),\n createWavefrontField(\"frontFace\", \"bool\", \"Front-face classification for shading and medium transitions.\"),\n ]),\n }),\n surface: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"SurfaceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier matched to the resolved hit.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"materialRefId\", \"u32\", \"Material-reference indirection for shading lookup tables.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Resolved medium transition/reference identifier.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"Preserved geometric normal for hemisphere checks.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Normal used for BSDF/BTDF evaluation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved texture coordinate.\"),\n createWavefrontField(\"tangentFrame\", \"mat3x3<f32>\", \"Optional tangent basis for normal-map transforms.\"),\n ]),\n }),\n materialReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MaterialReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"materialRefId\", \"u32\", \"Stable material lookup identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Authoritative material id from scene submission.\"),\n createWavefrontField(\"shadingModel\", \"u32\", \"Renderer-owned shading model enum.\"),\n createWavefrontField(\"textureSetId\", \"u32\", \"Texture indirection set for the material.\"),\n createWavefrontField(\"flags\", \"u32\", \"Alpha, emissive, transmission, and debug flags.\"),\n ]),\n }),\n mediumReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MediumReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"mediumRefId\", \"u32\", \"Stable medium lookup identifier.\"),\n createWavefrontField(\"mediumId\", \"u32\", \"Authoritative medium or fluid descriptor id.\"),\n createWavefrontField(\"phaseModel\", \"u32\", \"Medium phase-function selector.\"),\n createWavefrontField(\"absorption\", \"vec3<f32>\", \"Absorption coefficients for the active medium.\"),\n createWavefrontField(\"scattering\", \"vec3<f32>\", \"Scattering coefficients for the active medium.\"),\n ]),\n }),\n accumulation: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"AccumulationRecord\",\n fields: Object.freeze([\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel accumulator owner.\"),\n createWavefrontField(\"sampleCount\", \"u32\", \"Committed sample count for the pixel.\"),\n createWavefrontField(\"radiance\", \"vec3<f32>\", \"Accumulated radiance before tone-map/output resolve.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Last surviving physical throughput for debug and variance tracking.\"),\n createWavefrontField(\"resetEpoch\", \"u32\", \"Accumulation reset generation for history invalidation.\"),\n ]),\n }),\n});\n\nfunction buildWavefrontTerminationPolicy() {\n return Object.freeze({\n terminalHitTypes: Object.freeze([\"emissive\", \"environment\", \"miss\"]),\n continuationHitTypes: Object.freeze([\"surface\", \"transparent\"]),\n emissive: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n environment: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n miss: Object.freeze({\n action: \"accumulate-environment-or-dark-stop\",\n contributesRadiance: true,\n }),\n });\n}\n\nfunction buildWavefrontBounceSchedule(maxDepth) {\n return Object.freeze(\n Array.from({ length: maxDepth }, (_, index) =>\n Object.freeze({\n bounce: index,\n readQueue: index % 2 === 0 ? \"active\" : \"next\",\n writeQueue: index % 2 === 0 ? \"next\" : \"active\",\n passOrder: rendererWavefrontPassOrder,\n })\n )\n );\n}\n\nexport function createWavefrontPathTracingPlan(options = {}) {\n const maxDepth =\n options.maxDepth === undefined\n ? 6\n : readPositiveInteger(\"maxDepth\", options.maxDepth);\n const queueCapacity =\n options.queueCapacity === undefined\n ? 8192\n : readPositiveInteger(\"queueCapacity\", options.queueCapacity);\n const accumulationResetEpoch =\n options.accumulationResetEpoch === undefined\n ? 0\n : readNonNegativeInteger(\"accumulationResetEpoch\", options.accumulationResetEpoch);\n const explicitLightSampling = options.explicitLightSampling === true;\n\n return Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n owner: rendererDebugOwner,\n maxDepth,\n queueCapacity,\n explicitLightSampling,\n accumulationResetEpoch,\n queueLayout: Object.freeze({\n strategy: rendererWavefrontQueuePairStrategy,\n compactAfterScatter: true,\n queues: Object.freeze([\n Object.freeze({ name: \"active\", role: \"current-bounce\" }),\n Object.freeze({ name: \"next\", role: \"next-bounce\" }),\n ]),\n }),\n bufferContracts: rendererWavefrontBufferContracts,\n bounceSchedule: buildWavefrontBounceSchedule(maxDepth),\n terminationPolicy: buildWavefrontTerminationPolicy(),\n });\n}\n","import { clamp, dot, normalize, scale } from \"./wavefront-core.js\";\n\nexport const MAX_MEDIUM_STACK_DEPTH = 4;\nexport const MAX_TRANSPORT_BRANCHES = 2;\nexport const DEFAULT_SPECTRAL_WAVELENGTHS = Object.freeze([460, 550, 610]);\n\nfunction finite(value, fallback = 0) {\n return Number.isFinite(Number(value)) ? Number(value) : fallback;\n}\n\nfunction vec3(value, fallback = [0, 0, 0]) {\n return [0, 1, 2].map((index) => finite(value?.[index], fallback[index]));\n}\n\nfunction multiply(left, right) {\n return [left[0] * right[0], left[1] * right[1], left[2] * right[2]];\n}\n\nfunction reflectVector(incident, normal) {\n return add(incident, scale(normal, -2 * dot(incident, normal)));\n}\n\nfunction refract(incident, normal, eta) {\n const cosine = Math.min(dot(scale(incident, -1), normal), 1);\n const perpendicular = scale(add(incident, scale(normal, cosine)), eta);\n const parallel = scale(normal, -Math.sqrt(Math.abs(1 - dot(perpendicular, perpendicular))));\n return normalize(add(perpendicular, parallel), reflectVector(incident, normal));\n}\n\nfunction add(left, right) {\n return [left[0] + right[0], left[1] + right[1], left[2] + right[2]];\n}\n\nexport function createMediumStack(value = [], maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const depth = Math.max(1, Math.trunc(finite(maxDepth, MAX_MEDIUM_STACK_DEPTH)));\n const source = Array.isArray(value) ? value : [];\n return Object.freeze(\n source\n .map((mediumId) => Math.max(0, Math.trunc(finite(mediumId, 0))))\n .filter((mediumId) => mediumId > 0)\n .slice(-depth)\n );\n}\n\nexport function currentMediumId(stack) {\n const normalized = createMediumStack(stack);\n return normalized.at(-1) ?? 0;\n}\n\nexport function enterMediumStack(stack, mediumId, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const normalized = createMediumStack(stack, maxDepth);\n const id = Math.max(0, Math.trunc(finite(mediumId, 0)));\n if (id === 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), overflowed: false });\n }\n const depth = Math.max(1, Math.trunc(finite(maxDepth, MAX_MEDIUM_STACK_DEPTH)));\n const next = [...normalized, id];\n const overflowed = next.length > depth;\n const bounded = createMediumStack(next, depth);\n return Object.freeze({ stack: bounded, mediumId: id, overflowed });\n}\n\nexport function exitMediumStack(stack, mediumId, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n const normalized = createMediumStack(stack, maxDepth);\n const id = Math.max(0, Math.trunc(finite(mediumId, 0)));\n if (id === 0 || normalized.length === 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), matched: false });\n }\n const index = normalized.lastIndexOf(id);\n if (index < 0) {\n return Object.freeze({ stack: normalized, mediumId: currentMediumId(normalized), matched: false });\n }\n const next = normalized.slice(0, index).concat(normalized.slice(index + 1));\n return Object.freeze({\n stack: createMediumStack(next, maxDepth),\n mediumId: currentMediumId(next),\n matched: true,\n });\n}\n\nexport function transitionMediumStack(stack, mediumId, frontFace, maxDepth = MAX_MEDIUM_STACK_DEPTH) {\n return frontFace ? enterMediumStack(stack, mediumId, maxDepth) : exitMediumStack(stack, mediumId, maxDepth);\n}\n\nexport function beerLambertTransmittance(medium, distance) {\n const travelled = Math.max(0, finite(distance, 0));\n const absorption = vec3(medium?.absorption, [0, 0, 0]).map((value) => Math.max(0, value));\n return Object.freeze(absorption.map((coefficient) => Math.exp(-coefficient * travelled)));\n}\n\nexport function resolveSpectralIor(ior, dispersion = 0, wavelengthNm = 550) {\n const base = clamp(finite(ior, 1.45), 1, 3);\n const spread = clamp(finite(dispersion, 0), 0, 2);\n const wavelength = clamp(finite(wavelengthNm, 550), 380, 780);\n return clamp(base + spread * (550 / wavelength - 1), 1, 3.5);\n}\n\nexport function createSpectralSamples({\n ior = 1.45,\n dispersion = 0,\n wavelengths = DEFAULT_SPECTRAL_WAVELENGTHS,\n} = {}) {\n const source = Array.isArray(wavelengths) && wavelengths.length > 0 ? wavelengths : DEFAULT_SPECTRAL_WAVELENGTHS;\n const weight = 1 / source.length;\n return Object.freeze(\n source.map((wavelength) =>\n Object.freeze({\n wavelengthNm: clamp(finite(wavelength, 550), 380, 780),\n ior: resolveSpectralIor(ior, dispersion, wavelength),\n weight,\n })\n )\n );\n}\n\nfunction fresnel(cosine, etaRatio) {\n const r0 = ((1 - etaRatio) / (1 + etaRatio)) ** 2;\n return clamp(r0 + (1 - r0) * (1 - clamp(cosine, 0, 1)) ** 5, 0, 1);\n}\n\nexport function createTransportBranches({\n incidentDirection = [0, -1, 0],\n normal = [0, 1, 0],\n frontFace = true,\n ior = 1.45,\n dispersion = 0,\n transmission = 1,\n mediumStack = [],\n mediumId = 0,\n maxBranches = MAX_TRANSPORT_BRANCHES,\n wavelengths = DEFAULT_SPECTRAL_WAVELENGTHS,\n} = {}) {\n const incident = normalize(vec3(incidentDirection, [0, -1, 0]), [0, -1, 0]);\n const orientedNormal = normalize(vec3(normal, [0, 1, 0]), [0, 1, 0]);\n const etaRatio = frontFace ? 1 / Math.max(finite(ior, 1.45), 1.0001) : Math.max(finite(ior, 1.45), 1.0001);\n const cosine = clamp(dot(scale(incident, -1), orientedNormal), 0, 1);\n const sinTheta = Math.sqrt(Math.max(0, 1 - cosine * cosine));\n const cannotRefract = etaRatio * sinTheta > 1;\n const reflectWeight = cannotRefract ? 1 : fresnel(cosine, etaRatio);\n const transmitWeight = cannotRefract ? 0 : (1 - reflectWeight) * clamp(finite(transmission, 1), 0, 1);\n const branches = [\n Object.freeze({\n kind: \"reflection\",\n direction: Object.freeze(normalize(reflectVector(incident, orientedNormal), orientedNormal)),\n weight: reflectWeight,\n mediumStack: Object.freeze(createMediumStack(mediumStack)),\n mediumId: currentMediumId(mediumStack),\n wavelengths: createSpectralSamples({ ior, dispersion, wavelengths }),\n }),\n ];\n if (transmitWeight > 0.000001 && branches.length < Math.max(1, Math.trunc(maxBranches))) {\n const transition = transitionMediumStack(mediumStack, mediumId, frontFace);\n branches.push(\n Object.freeze({\n kind: \"transmission\",\n direction: Object.freeze(normalize(refract(incident, orientedNormal, etaRatio), orientedNormal)),\n weight: transmitWeight,\n mediumStack: transition.stack,\n mediumId: transition.mediumId,\n mediumStackOverflowed: transition.overflowed ?? false,\n wavelengths: createSpectralSamples({ ior, dispersion, wavelengths }),\n })\n );\n }\n return Object.freeze(branches.filter((branch) => branch.weight > 0.000001));\n}\n\nexport function applyMediumTransmittance(throughput, medium, distance) {\n return Object.freeze(multiply(vec3(throughput, [1, 1, 1]), beerLambertTransmittance(medium, distance)));\n}\n","import {\n defaultRendererWorkerProfile,\n rendererAccelerationStructureUpdateClasses,\n rendererDebugOwner,\n rendererRayTracingStageOrder,\n rendererRepresentationBands,\n rendererWorkerQueueClass,\n} from \"./renderer-constants.js\";\nimport { assertRendererIdentifier } from \"./renderer-validation.js\";\nimport { createWavefrontPathTracingPlan } from \"./renderer-wavefront-plan.js\";\n\nconst rendererRayTracingStageDefinitions = Object.freeze(\n rendererRayTracingStageOrder.map((key, index) =>\n Object.freeze({\n key,\n order: index + 1,\n required: true,\n description:\n {\n primaryVisibility: \"Primary visibility and depth preparation.\",\n shadowAssist: \"Shadow assist passes and regional shadow preparation.\",\n opaqueFoundation: \"Main opaque foundation for shading and tracing inputs.\",\n rtDirectLighting: \"Ray-traced direct lighting and premium shadows.\",\n rtReflections: \"Ray-traced reflections for important surfaces.\",\n rtGlobalIllumination: \"Selective ray-traced indirect lighting and GI.\",\n denoiseTemporal: \"Required denoise and temporal accumulation stage.\",\n transparents: \"Transparents, particles, and volumetrics composition.\",\n composition: \"Final world composition and color resolve.\",\n present: \"Presentation to the active surface.\",\n }[key],\n })\n )\n);\n\nconst rendererRepresentationBandPolicies = Object.freeze({\n near: Object.freeze({\n band: \"near\",\n rasterMode: \"full-live\",\n rtParticipation: \"premium\",\n shadowSource: \"ray-traced-primary\",\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n }),\n mid: Object.freeze({\n band: \"mid\",\n rasterMode: \"simplified-live\",\n rtParticipation: \"selective\",\n shadowSource: \"regional-raster-and-proxy\",\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n }),\n far: Object.freeze({\n band: \"far\",\n rasterMode: \"proxy-or-cached\",\n rtParticipation: \"proxy\",\n shadowSource: \"merged-proxy-casters\",\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n }),\n horizon: Object.freeze({\n band: \"horizon\",\n rasterMode: \"horizon-shell\",\n rtParticipation: \"disabled\",\n shadowSource: \"baked-impression\",\n temporalReuse: \"cached\",\n updateCadenceDivisor: 60,\n }),\n});\n\nconst rendererAccelerationStructurePolicies = Object.freeze(\n rendererAccelerationStructureUpdateClasses.map((updateClass) =>\n Object.freeze({\n updateClass,\n description:\n {\n static: \"Stable static world geometry with infrequent rebuilds.\",\n \"rigid-dynamic\":\n \"Rigid transforms that can be refit or relinked without full deformation updates.\",\n deforming:\n \"Skinned or vertex-deforming content treated as a managed RT cost center.\",\n proxy:\n \"Low-cost RT proxy or distant representation updates.\",\n }[updateClass],\n })\n )\n);\n\nfunction buildRendererWorkerBudgetLevels(jobType, queueClass, levels) {\n return Object.freeze(\n levels.map((level) =>\n Object.freeze({\n id: level.id,\n estimatedCostMs: level.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: level.config.maxDispatchesPerFrame,\n maxJobsPerDispatch: level.config.maxJobsPerDispatch,\n cadenceDivisor: level.config.cadenceDivisor,\n workgroupScale: level.config.workgroupScale,\n maxQueueDepth: level.config.maxQueueDepth,\n metadata: Object.freeze({\n owner: rendererDebugOwner,\n queueClass,\n jobType,\n quality: level.id,\n }),\n }),\n })\n )\n );\n}\n\nconst rendererWorkerProfileSpecs = {\n realtime: {\n description:\n \"Frame-stage DAG for flat rendering with visibility, main encode, post-processing, and submit.\",\n suggestedAllocationIds: [\n \"renderer.surface.current\",\n \"renderer.visibility.worklist\",\n \"renderer.post-process.history\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.4,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 512,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.visibility.worklist\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"acquire\", \"visibility\"],\n domain: \"geometry\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 2.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 3,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n postProcess: {\n priority: 3,\n dependencies: [\"mainEncode\"],\n domain: \"post-processing\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.4,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.post-process.history\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"postProcess\"],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n },\n },\n xr: {\n description:\n \"Frame-stage DAG for XR rendering with late-latch coordination before main encode and submit.\",\n suggestedAllocationIds: [\n \"renderer.xr.surface.current\",\n \"renderer.xr.visibility.worklist\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.3,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.visibility.worklist\"],\n },\n lateLatch: {\n priority: 5,\n dependencies: [\"acquire\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.15,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"visibility\", \"lateLatch\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 1.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 2.6,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"mainEncode\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n },\n },\n};\n\nfunction buildRendererInputBoundary(profile) {\n return Object.freeze({\n type: \"stable-visual-snapshot\",\n owner: rendererDebugOwner,\n profile,\n authority: \"visual\",\n source: \"scene-preparation\",\n stable: true,\n });\n}\n\nfunction buildRendererRenderStages(profile) {\n return Object.freeze(\n rendererRayTracingStageDefinitions.map((stage) =>\n Object.freeze({\n ...stage,\n profile,\n workerJobKeys:\n profile === \"xr\" && stage.key === \"primaryVisibility\"\n ? Object.freeze([\"lateLatch\", \"visibility\"])\n : stage.key === \"present\"\n ? Object.freeze([\"submit\"])\n : stage.key === \"denoiseTemporal\" ||\n stage.key === \"transparents\" ||\n stage.key === \"composition\"\n ? Object.freeze([\"postProcess\"])\n : stage.key === \"primaryVisibility\"\n ? Object.freeze([\"visibility\"])\n : stage.key === \"shadowAssist\" ||\n stage.key === \"opaqueFoundation\" ||\n stage.key === \"rtDirectLighting\" ||\n stage.key === \"rtReflections\" ||\n stage.key === \"rtGlobalIllumination\"\n ? Object.freeze([\"mainEncode\"])\n : Object.freeze([\"mainEncode\"]),\n })\n )\n );\n}\n\nfunction buildRendererRepresentationBands(profile) {\n return Object.freeze(\n rendererRepresentationBands.map((band) =>\n Object.freeze({\n ...rendererRepresentationBandPolicies[band],\n profile,\n })\n )\n );\n}\n\nfunction buildRendererAccelerationStructureUpdates(profile) {\n return Object.freeze(\n rendererAccelerationStructurePolicies.map((policy) =>\n Object.freeze({\n ...policy,\n profile,\n })\n )\n );\n}\n\nfunction buildRendererWorkerProfile(name, spec) {\n return Object.freeze({\n name,\n description: spec.description,\n jobs: Object.freeze(Object.keys(spec.jobs)),\n });\n}\n\nfunction buildRendererWorkerManifestJob(profileName, jobName, spec) {\n const label = `renderer.${profileName}.${jobName}`;\n return Object.freeze({\n key: jobName,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n priority: spec.priority,\n dependencies: Object.freeze(\n spec.dependencies.map((dependency) => `renderer.${profileName}.${dependency}`)\n ),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: buildRendererWorkerBudgetLevels(\n label,\n rendererWorkerQueueClass,\n spec.levels\n ),\n }),\n debug: Object.freeze({\n owner: rendererDebugOwner,\n queueClass: rendererWorkerQueueClass,\n jobType: label,\n tags: Object.freeze([\"renderer\", profileName, jobName, spec.domain]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildRendererWorkerManifest(name, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile: name,\n description: spec.description,\n queueClass: rendererWorkerQueueClass,\n schedulerMode: \"dag\",\n inputBoundary: buildRendererInputBoundary(name),\n renderStages: buildRendererRenderStages(name),\n representationBands: buildRendererRepresentationBands(name),\n accelerationStructureUpdates: buildRendererAccelerationStructureUpdates(name),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([jobName, jobSpec]) =>\n buildRendererWorkerManifestJob(name, jobName, jobSpec)\n )\n ),\n });\n}\n\nexport const rendererWorkerProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerProfile(name, spec),\n ])\n )\n);\n\nexport const rendererWorkerProfileNames = Object.freeze(\n Object.keys(rendererWorkerProfiles)\n);\n\nexport const rendererWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerManifest(name, spec),\n ])\n )\n);\n\nexport function getRendererWorkerProfile(name = defaultRendererWorkerProfile) {\n const profile = rendererWorkerProfiles[name];\n if (!profile) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getRendererWorkerManifest(name = defaultRendererWorkerProfile) {\n const manifest = rendererWorkerManifests[name];\n if (!manifest) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return manifest;\n}\n\nexport function createRayTracingRenderPlan(options = {}) {\n const profile = options.profile ?? defaultRendererWorkerProfile;\n const snapshotId = assertRendererIdentifier(\n \"snapshotId\",\n options.snapshotId\n );\n const workerManifest = getRendererWorkerManifest(profile);\n const representations = Array.isArray(options.representations)\n ? Object.freeze(\n options.representations.map((representation, index) => {\n if (!representation || typeof representation !== \"object\") {\n throw new Error(`representations[${index}] must be an object.`);\n }\n const band = assertRendererIdentifier(\n `representations[${index}].band`,\n representation.band\n );\n if (!rendererRepresentationBands.includes(band)) {\n throw new Error(\n `representations[${index}].band must be one of: ${rendererRepresentationBands.join(\", \")}.`\n );\n }\n return Object.freeze({\n ...representation,\n band,\n });\n })\n )\n : workerManifest.representationBands;\n\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile,\n inputBoundary: Object.freeze({\n ...workerManifest.inputBoundary,\n snapshotId,\n }),\n renderStages: workerManifest.renderStages,\n representationBands: representations,\n accelerationStructureUpdates: workerManifest.accelerationStructureUpdates,\n wavefront: createWavefrontPathTracingPlan(options.wavefront),\n workerManifest,\n });\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAlC,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACZ3B,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAvC,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["scale","texture","pass","module","scale","dot","clamp01","lerp","resolveCanvas","scale","options","nowMs","clamp01","lerp","lerp3","normalize3","durationFromBeats","resolveBeat","movementDistance","key","DEFAULT_CAMERA","readPositiveInteger","readNonNegativeInteger","clamp","clamp","readPositiveInteger","cross","dimension","clamp","readNonNegativeInteger","deriveBounds","clamp","readNonNegativeInteger","clamp","cross","readNonNegativeInteger","readNonNegativeInteger","cross","DEFAULT_CAMERA","clamp","readPositiveInteger","cross","fresnel","clamp","resolveCanvas","nowMs","nowMs","waitForSubmittedGpuWork","clamp","readPositiveInteger","clamp","readNonNegativeInteger","readPositiveInteger","dimension","radicalInverseVdc","readPositiveInteger","waitForSubmittedGpuWork","clamp","readNonNegativeInteger","clamp","readNonNegativeInteger","readPositiveInteger","cross","cross","resolveCanvas","DEFAULT_CAMERA","waitForSubmittedGpuWork","nowMs","add","clamp"]}
|