@plasius/gpu-renderer 0.2.6 → 0.2.8

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wavefront-frame-runtime.js","../src/wavefront-compute.js","../src/index.js"],"sourcesContent":["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 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","import {\n createGpuParallelismCounters,\n createGpuParallelismDiagnostics,\n createGpuSubmissionBatcher,\n createGpuWorkerJobDiagnostics,\n recordDirectDispatch,\n recordIndirectDispatch,\n} from \"./wavefront-frame-runtime.js\"\n\nconst DEFAULT_WIDTH = 1280;\nconst DEFAULT_HEIGHT = 720;\nconst DEFAULT_MAX_DEPTH = 6;\nconst DEFAULT_TILE_SIZE = 128;\nconst DEFAULT_SAMPLES_PER_PIXEL = 1;\nconst MAX_SAMPLES_PER_PIXEL = 256;\nconst DEFAULT_BRDF_LUT_SIZE = 256;\nconst DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION = 256;\nconst DEFAULT_SCENE_OBJECT_CAPACITY = 128;\nconst DEFAULT_ENVIRONMENT_PORTAL_CAPACITY = 32;\nconst WORKGROUP_SIZE = 64;\nexport const rendererWavefrontComputeMode = \"webgpu-compute\";\nexport const rendererWavefrontComputeWorkgroupSize = WORKGROUP_SIZE;\nexport const rendererWavefrontComputeStatsStride = 8;\nconst RAY_RECORD_BYTES = 80;\nconst HIT_RECORD_BYTES = 256;\nconst SCENE_OBJECT_RECORD_BYTES = 144;\nconst MESH_VERTEX_RECORD_BYTES = 48;\nconst MESH_RANGE_RECORD_BYTES = 240;\nconst TRIANGLE_RECORD_BYTES = 352;\nconst GPU_MATERIAL_RECORD_BYTES = 192;\nconst BVH_NODE_RECORD_BYTES = 48;\nconst BVH_LEAF_REF_RECORD_BYTES = 16;\nconst EMISSIVE_TRIANGLE_INDEX_BYTES = 4;\nconst ENVIRONMENT_PORTAL_RECORD_BYTES = 96;\nconst ACCUMULATION_RECORD_BYTES = 16;\nconst PATH_VERTEX_RECORD_BYTES = 16;\nconst GPU_SUBMITTED_WORK_TIMEOUT_MS = 5_000;\nconst GPU_READBACK_COMPLETION_TIMEOUT_MS = 60_000;\nconst GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS = 60_000;\nconst CONFIG_BUFFER_BYTES = 320;\nconst COUNTER_DISPATCH_ARGS_OFFSET = 16;\nconst INDIRECT_DISPATCH_ARGS_BYTES = 12;\nconst COUNTER_BUFFER_BYTES = 32;\nconst TRACE_STORAGE_BUFFER_BINDINGS = 10;\nconst BRDF_LUT_UPLOAD_CACHE = new Map();\nconst HIT_TYPE_SURFACE = 0;\nconst HIT_TYPE_EMISSIVE = 1;\nconst MATERIAL_DIFFUSE = 0;\nconst MATERIAL_METAL = 1;\nconst MATERIAL_DIELECTRIC = 2;\nconst MATERIAL_TRANSPARENT = 3;\nconst MATERIAL_EMISSIVE = 4;\nconst OBJECT_KIND_SPHERE = 1;\nconst OBJECT_KIND_BOX = 2;\n\nconst 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\nconst DEFAULT_ENVIRONMENT_COLOR = Object.freeze([0.35, 0.43, 0.49, 1]);\nconst DEFAULT_AMBIENT_COLOR = Object.freeze([0.018, 0.022, 0.026, 1]);\nconst 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 wavefrontPathTracingComputeLimits = Object.freeze({\n workgroupSize: WORKGROUP_SIZE,\n traceStorageBufferBindings: TRACE_STORAGE_BUFFER_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\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\nfunction 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\nfunction 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\nfunction 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\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction 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\nfunction 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\nfunction maxComponent(value) {\n return Math.max(value?.[0] ?? 0, value?.[1] ?? 0, value?.[2] ?? 0);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction resolveDeferredPathResolve(options = {}) {\n const value =\n options.deferredPathResolve ??\n options.deferredResolve ??\n options.pathResolve?.deferred ??\n true;\n return value !== false;\n}\n\nfunction emissionPower(emission) {\n return Math.max(0, emission?.[0] ?? 0) + Math.max(0, emission?.[1] ?? 0) + Math.max(0, emission?.[2] ?? 0);\n}\n\nfunction asUnitVec3(value, fallback) {\n const vector = asVec3(value, fallback);\n return normalize(vector, fallback);\n}\n\nfunction add(a, b) {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\nfunction subtract(a, b) {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction scale(a, scalar) {\n return [a[0] * scalar, a[1] * scalar, a[2] * scalar];\n}\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction random01FromSeed(seed) {\n return (hashUint32(seed) & 0x00ffffff) / 16777215;\n}\n\nfunction getArrayLikeLength(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value) ? value.length : 0;\n}\n\nfunction 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\nfunction readVector2(values, index, fallback = [0, 0]) {\n return readVector(values, index, 2, fallback);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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 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 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, 0),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 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 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, 1.45), 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, 0), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n 0.08\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, 1), 0, 1),\n specularColor: Object.freeze(specularColor),\n transmission,\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 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, 0),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.specularColor,\n [1, 1, 1, 1]\n ).map((value, componentIndex) => (componentIndex < 3 ? clamp(value, 0, 1) : 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 ?? input.medium?.id ?? input.mediumId,\n 0\n ),\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, 1.45), 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, 0), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n 0.08\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, 1), 0, 1),\n specularColor: Object.freeze(specularColor),\n transmission,\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 });\n}\n\nfunction clampUnit(value) {\n return clamp(Number(value) || 0, 0, 1);\n}\n\nfunction srgbToLinear(value) {\n const channel = clampUnit(value);\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return ((channel + 0.055) / 1.055) ** 2.4;\n}\n\nfunction sampleTextureRgba(texture, uv = [0, 0], colorSpace = \"linear\") {\n if (\n !texture ||\n !Number.isFinite(texture.width) ||\n !Number.isFinite(texture.height) ||\n !texture.data ||\n texture.width <= 0 ||\n texture.height <= 0\n ) {\n return [1, 1, 1, 1];\n }\n const u = ((uv[0] % 1) + 1) % 1;\n const v = ((uv[1] % 1) + 1) % 1;\n const x = Math.min(texture.width - 1, Math.max(0, Math.round(u * (texture.width - 1))));\n const y = Math.min(texture.height - 1, Math.max(0, Math.round((1 - v) * (texture.height - 1))));\n const offset = (y * texture.width + x) * 4;\n const data = texture.data;\n const scale = resolveTextureSampleScale(data);\n const defaultChannel = scale === 1 ? 1 : Math.round(1 / scale);\n const color = [\n (data[offset] ?? defaultChannel) * scale,\n (data[offset + 1] ?? defaultChannel) * scale,\n (data[offset + 2] ?? defaultChannel) * scale,\n (data[offset + 3] ?? defaultChannel) * scale,\n ];\n if (colorSpace === \"srgb\") {\n return [srgbToLinear(color[0]), srgbToLinear(color[1]), srgbToLinear(color[2]), color[3]];\n }\n return color;\n}\n\nfunction resolveTextureSampleScale(data) {\n if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) {\n return 1 / 255;\n }\n if (data instanceof Uint16Array) {\n return 1 / 65535;\n }\n if (Array.isArray(data) && data.some((value) => Number(value) > 1)) {\n return 1 / 255;\n }\n return 1;\n}\n\nfunction normalizeVectorOrFallback(vector, fallback) {\n return normalize(Array.isArray(vector) ? vector : fallback, fallback);\n}\n\nfunction buildTriangleTangentBasis(v0, v1, v2, uv0, uv1, uv2, fallbackNormal) {\n const edge1 = subtract(v1, v0);\n const edge2 = subtract(v2, v0);\n const deltaUv1 = [uv1[0] - uv0[0], uv1[1] - uv0[1]];\n const deltaUv2 = [uv2[0] - uv0[0], uv2[1] - uv0[1]];\n const determinant = deltaUv1[0] * deltaUv2[1] - deltaUv1[1] * deltaUv2[0];\n if (Math.abs(determinant) < 1e-6) {\n const tangentFallback = Math.abs(fallbackNormal[1]) < 0.999 ? [0, 1, 0] : [1, 0, 0];\n const tangent = normalize(cross(tangentFallback, fallbackNormal), [1, 0, 0]);\n const bitangent = normalize(cross(fallbackNormal, tangent), [0, 0, 1]);\n return { tangent, bitangent };\n }\n const inverse = 1 / determinant;\n const tangent = normalize(\n [\n inverse * (edge1[0] * deltaUv2[1] - edge2[0] * deltaUv1[1]),\n inverse * (edge1[1] * deltaUv2[1] - edge2[1] * deltaUv1[1]),\n inverse * (edge1[2] * deltaUv2[1] - edge2[2] * deltaUv1[1]),\n ],\n [1, 0, 0]\n );\n const bitangent = normalize(\n [\n inverse * (-edge1[0] * deltaUv2[0] + edge2[0] * deltaUv1[0]),\n inverse * (-edge1[1] * deltaUv2[0] + edge2[1] * deltaUv1[0]),\n inverse * (-edge1[2] * deltaUv2[0] + edge2[2] * deltaUv1[0]),\n ],\n [0, 0, 1]\n );\n return { tangent, bitangent };\n}\n\nfunction applyNormalMap(normal, tangent, bitangent, normalTexture, uv) {\n if (!normalTexture) {\n return normalizeVectorOrFallback(normal, [0, 1, 0]);\n }\n const sample = sampleTextureRgba(normalTexture, uv, \"linear\");\n const strength = clampUnit(normalTexture.scale ?? 1);\n const tangentNormal = normalize(\n [\n (sample[0] * 2 - 1) * strength,\n (sample[1] * 2 - 1) * strength,\n 1 + (sample[2] * 2 - 1 - 1) * strength,\n ],\n [0, 0, 1]\n );\n return normalize(\n [\n tangent[0] * tangentNormal[0] + bitangent[0] * tangentNormal[1] + normal[0] * tangentNormal[2],\n tangent[1] * tangentNormal[0] + bitangent[1] * tangentNormal[1] + normal[1] * tangentNormal[2],\n tangent[2] * tangentNormal[0] + bitangent[2] * tangentNormal[1] + normal[2] * tangentNormal[2],\n ],\n normal\n );\n}\n\nfunction sampleBaseColor(mesh, uv) {\n const sample = mesh.baseColorTexture ? sampleTextureRgba(mesh.baseColorTexture, uv, \"srgb\") : [1, 1, 1, 1];\n return [\n clampUnit(mesh.color[0] * sample[0]),\n clampUnit(mesh.color[1] * sample[1]),\n clampUnit(mesh.color[2] * sample[2]),\n clampUnit((mesh.color[3] ?? 1) * sample[3]),\n ];\n}\n\nfunction sampleSurfaceMaterial(mesh, uv) {\n const textureSample = mesh.metallicRoughnessTexture\n ? sampleTextureRgba(mesh.metallicRoughnessTexture, uv, \"linear\")\n : [1, 1, 1, 1];\n return {\n roughness: clamp(mesh.roughness * textureSample[1], 0, 1),\n metallic: clamp(mesh.metallic * textureSample[2], 0, 1),\n };\n}\n\nfunction averageColors(colors) {\n const count = Math.max(colors.length, 1);\n return colors.reduce(\n (accumulator, color) => [\n accumulator[0] + color[0] / count,\n accumulator[1] + color[1] / count,\n accumulator[2] + color[2] / count,\n accumulator[3] + color[3] / count,\n ],\n [0, 0, 0, 0]\n );\n}\n\nfunction averageNumbers(values, fallback = 0) {\n if (!Array.isArray(values) || values.length === 0) {\n return fallback;\n }\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction createMeshTriangleRecords(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\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 tangentBasis = buildTriangleTangentBasis(v0, v1, v2, uv0, uv1, uv2, faceNormal);\n const shadedN0 = applyNormalMap(n0, tangentBasis.tangent, tangentBasis.bitangent, mesh.normalTexture, uv0);\n const shadedN1 = applyNormalMap(n1, tangentBasis.tangent, tangentBasis.bitangent, mesh.normalTexture, uv1);\n const shadedN2 = applyNormalMap(n2, tangentBasis.tangent, tangentBasis.bitangent, mesh.normalTexture, uv2);\n const sampledColors = [sampleBaseColor(mesh, uv0), sampleBaseColor(mesh, uv1), sampleBaseColor(mesh, uv2)];\n const sampledMaterials = [\n sampleSurfaceMaterial(mesh, uv0),\n sampleSurfaceMaterial(mesh, uv1),\n sampleSurfaceMaterial(mesh, uv2),\n ];\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(shadedN0),\n n1: Object.freeze(shadedN1),\n n2: Object.freeze(shadedN2),\n uv0: Object.freeze(uv0),\n uv1: Object.freeze(uv1),\n uv2: Object.freeze(uv2),\n color: Object.freeze(averageColors(sampledColors)),\n emission: mesh.emission,\n material: Object.freeze([\n averageNumbers(sampledMaterials.map((sample) => sample.roughness), mesh.roughness),\n averageNumbers(sampledMaterials.map((sample) => sample.metallic), 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 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 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 = []) {\n const source = Array.isArray(meshes) ? meshes : [meshes];\n const triangles = createMeshTriangleRecords(source);\n return buildBvh(triangles);\n}\n\nfunction 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\nfunction 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 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 0,\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 });\n}\n\nfunction 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\nfunction resolveAccelerationBuildMode(options = {}) {\n const mode = options.accelerationBuildMode ?? (options.displayQuality === true ? \"gpu\" : \"cpu-debug\");\n if (mode !== \"gpu\" && mode !== \"cpu-debug\") {\n throw new Error(\"accelerationBuildMode must be either \\\"gpu\\\" or \\\"cpu-debug\\\".\");\n }\n if (options.displayQuality === true && mode !== \"gpu\") {\n throw new Error(\"Display-quality path tracing requires GPU-built mesh acceleration.\");\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 0,\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\nfunction 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\nfunction normalizeMeshes(options = {}) {\n if (Array.isArray(options.meshes)) {\n return options.meshes;\n }\n if (options.mesh) {\n return [options.mesh];\n }\n return [];\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 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 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\nfunction 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 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 16\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 const materialCapacity = readNonNegativeInteger(\"materialCapacity\", options.materialCapacity, 0);\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 = triangleCapacity * TRIANGLE_RECORD_BYTES;\n const materialTableBytes = materialCapacity * GPU_MATERIAL_RECORD_BYTES;\n const bvhNodeBytes = bvhNodeCapacity * BVH_NODE_RECORD_BYTES;\n const bvhLeafReferenceBytes = bvhLeafSortCapacity * BVH_LEAF_REF_RECORD_BYTES;\n const emissiveTriangleMetadataBytes =\n emissiveTriangleCapacity * BVH_NODE_RECORD_BYTES;\n const environmentPortalBytes =\n environmentPortalCapacity * ENVIRONMENT_PORTAL_RECORD_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 bvhLeafReferenceBytes,\n emissiveTriangleMetadataBytes,\n environmentPortalBytes,\n configBytes: CONFIG_BUFFER_BYTES,\n counterBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n totalHotBufferBytes:\n queueBytes * 2 +\n hitBytes +\n accumulationBytes +\n pathVertexBytes +\n sceneObjectBytes +\n triangleBytes +\n materialTableBytes +\n bvhNodeBytes +\n bvhLeafReferenceBytes +\n emissiveTriangleMetadataBytes +\n environmentPortalBytes +\n CONFIG_BUFFER_BYTES +\n COUNTER_BUFFER_BYTES +\n INDIRECT_DISPATCH_ARGS_BYTES,\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(readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH), 1, 16);\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-debug\"\n ? createWavefrontMeshAcceleration(meshes)\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 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\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 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 displayQuality: options.displayQuality === true,\n requiresMeshBvhForDisplayQuality: true,\n denoise: options.denoise !== false,\n frameIndex: readNonNegativeInteger(\"frameIndex\", options.frameIndex, 0),\n memory: estimateWavefrontPathTracingMemory({\n tilePixelCapacity,\n maxDepth,\n sceneObjectCapacity,\n triangleCapacity,\n materialCapacity: gpuMaterialSource.count,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n environmentPortalCapacity,\n }),\n });\n}\n\nexport function supportsWavefrontPathTracingCompute(options = {}) {\n const navigatorRef = options.navigator ?? globalThis.navigator;\n return typeof navigatorRef?.gpu?.requestAdapter === \"function\";\n}\n\nfunction 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\nfunction 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\nfunction writeVec4(floatView, byteOffset, value) {\n const index = byteOffset / 4;\n floatView[index] = value[0] ?? 0;\n floatView[index + 1] = value[1] ?? 0;\n floatView[index + 2] = value[2] ?? 0;\n floatView[index + 3] = value[3] ?? 0;\n}\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 writeVec4(floatView, byteOffset + 16, [...object.center, 0]);\n writeVec4(floatView, byteOffset + 32, [...object.halfExtent, 0]);\n writeVec4(floatView, byteOffset + 48, object.color);\n writeVec4(floatView, byteOffset + 64, object.emission);\n writeVec4(floatView, byteOffset + 80, [\n object.roughness,\n object.metallic,\n object.opacity,\n object.ior,\n ]);\n writeVec4(floatView, byteOffset + 96, [\n object.sheenColor[0] ?? 0,\n object.sheenColor[1] ?? 0,\n object.sheenColor[2] ?? 0,\n object.clearcoat,\n ]);\n writeVec4(floatView, byteOffset + 112, [\n object.clearcoatRoughness,\n object.specular,\n object.transmission,\n 0,\n ]);\n writeVec4(floatView, byteOffset + 128, [\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 });\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\nfunction 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, 0, true);\n data.setUint32(268, 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 0,\n 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\nfunction 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\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 = random01FromSeed(mixSeed(sourcePixelId, sampleIndex, 0, frameIndex, 1)) - 0.5;\n const jitterY = random01FromSeed(mixSeed(sourcePixelId, sampleIndex, 0, frameIndex, 2)) - 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 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 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 maxPixels = Math.max(256, Math.min(maxPixelsByRay, maxPixelsByHit));\n if (config.tilePixelCapacity <= maxPixels) {\n return config.tileSize;\n }\n\n return Math.max(16, Math.floor(Math.sqrt(maxPixels)));\n}\n\nfunction createBuffer(device, usage, size, label) {\n return device.createBuffer({\n label,\n size: Math.max(4, size),\n usage,\n });\n}\n\nfunction 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 reflectVector(direction, normal) {\n return subtract(direction, scale(normal, 2 * dot(direction, normal)));\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction hammersley(index, count) {\n return [index / Math.max(count, 1), radicalInverseVdc(index)];\n}\n\nfunction 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\nfunction 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\nfunction geometrySchlickGgx(nDotV, roughness) {\n const k = ((roughness + 1) * (roughness + 1)) / 8;\n return nDotV / Math.max(nDotV * (1 - k) + k, 0.000001);\n}\n\nfunction geometrySmith(nDotV, nDotL, roughness) {\n return geometrySchlickGgx(nDotV, roughness) * geometrySchlickGgx(nDotL, roughness);\n}\n\nfunction 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\nfunction createBrdfLutUploadBytes(size = DEFAULT_BRDF_LUT_SIZE, sampleCount = 1024) {\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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nasync function getPipelineDiagnostics(shaderModule) {\n if (typeof shaderModule?.compilationInfo !== \"function\") {\n return \"\";\n }\n try {\n const info = await shaderModule.compilationInfo();\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\nasync 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\nasync function assertShaderModuleCompiles(shaderModule, label) {\n if (typeof shaderModule?.compilationInfo !== \"function\") {\n return;\n }\n const info = await shaderModule.compilationInfo();\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\nasync function createRenderPipeline(device, descriptor) {\n if (typeof device.createRenderPipelineAsync === \"function\") {\n return device.createRenderPipelineAsync(descriptor);\n }\n return device.createRenderPipeline(descriptor);\n}\n\nconst WAVEFRONT_COMPUTE_WGSL = `\nconst RAY_FLAG_GUIDED_EMISSIVE: u32 = 1u;\nconst RAY_FLAG_DELTA_SAMPLE: u32 = 2u;\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 pad0: u32,\n origin: vec4<f32>,\n direction: vec4<f32>,\n throughput: vec4<f32>,\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 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};\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 flags: u32,\n pad0: u32,\n pad1: 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 _portalPad0: u32,\n _portalPad1: u32,\n environmentMapSettings: vec4<f32>,\n pathResolveSettings: vec4<f32>,\n environmentMapMeta: vec4<f32>,\n};\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};\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\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 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\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 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 triangle.materialResponse,\n triangle.materialExtension,\n triangle.specularColor,\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 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 record_deferred_path_response(ray: RayRecord, response: 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>(max(response, vec3<f32>(0.0)), 1.0);\n}\n\nfn record_deferred_terminal_source(ray: RayRecord, sourceRadiance: vec3<f32>) {\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>(clamp_sample_radiance(sourceRadiance), 1.0);\n}\n\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_environment_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 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 let gradient =\n config.environmentHorizonColor.xyz * (1.0 - upFactor) +\n config.environmentZenithColor.xyz * upFactor;\n return (\n gradient +\n config.environmentSunColor.xyz * sunGlow\n ) * max(config.environmentSunDirectionIntensity.w, 0.0001);\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 radical_inverse_vdc(bitsValue: u32) -> f32 {\n var bits = bitsValue;\n bits = (bits << 16u) | (bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xaaaaaaaau) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xccccccccu) >> 2u);\n bits = ((bits & 0x0f0f0f0fu) << 4u) | ((bits & 0xf0f0f0f0u) >> 4u);\n bits = ((bits & 0x00ff00ffu) << 8u) | ((bits & 0xff00ff00u) >> 8u);\n return f32(bits) * 2.3283064365386963e-10;\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 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 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\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 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 surface_path_response(hit: HitRecord) -> vec3<f32> {\n let color = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let opacity = clamp(hit.material.z, 0.0, 1.0);\n let occlusion = clamp(hit.occlusion, 0.0, 1.0);\n let materialEnergy = select(0.68, 0.92, hit.materialKind == 1u || hit.materialKind == 2u);\n let transparentEnergy = select(materialEnergy, 0.9, hit.hitType == 3u);\n return mix(vec3<f32>(1.0), color, max(opacity, 0.18)) * transparentEnergy * mix(0.55, 1.0, occlusion);\n}\n\nfn bounded_path_response_luminance(ray: RayRecord, hit: HitRecord) -> f32 {\n let daylightFloor = max(config.pathResolveSettings.y, 0.0) * 0.08;\n let hdriFloor = max(config.environmentMapSettings.w, 0.0) * 0.02;\n let sceneFloor = max(daylightFloor, hdriFloor);\n if (sceneFloor <= 0.000001) {\n return 0.0;\n }\n let bounceRatio = select(\n 0.0,\n f32(ray.bounce) / max(f32(config.maxDepth - 1u), 1.0),\n config.maxDepth > 1u\n );\n let bounceScale = 1.0 - bounceRatio * 0.55;\n let materialScale = select(1.0, 0.34, hit.materialKind == 1u || hit.materialKind == 2u);\n let transparentScale = select(materialScale, 0.58, hit.hitType == 3u);\n let opacityScale = mix(0.55, 1.0, clamp(hit.material.z, 0.0, 1.0));\n return sceneFloor * bounceScale * transparentScale * opacityScale;\n}\n\nfn stabilize_surface_path_response(ray: RayRecord, hit: HitRecord, response: vec3<f32>) -> vec3<f32> {\n let minimumLuminance = bounded_path_response_luminance(ray, hit);\n let responseLuminance = radiance_luminance(response);\n if (minimumLuminance <= 0.000001 || responseLuminance >= minimumLuminance) {\n return response;\n }\n let tintBase = max(response, max(hit.color.xyz * 0.65, config.ambientColor.xyz * 0.35));\n let tint = tintBase / max(max_component(tintBase), 0.0001);\n let lifted = select(\n tint * minimumLuminance,\n response * (minimumLuminance / max(responseLuminance, 0.0001)),\n responseLuminance > 0.0001\n );\n return clamp(lifted, vec3<f32>(0.0), vec3<f32>(0.98));\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 clamp_sample_radiance(sunTint * baseline * skyFacing * directionalWeight * 0.04);\n}\n\nfn terminal_surface_environment_source(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let origin = hit.position.xyz + normal * 0.003;\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 clamp_sample_radiance(environmentFloor * materialFloor);\n}\n\nfn terminal_surface_environment_contribution(ray: RayRecord, hit: HitRecord) -> 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 clamp_sample_radiance(\n ray.throughput.xyz *\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 );\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 surface_direct_environment_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let origin = hit.position.xyz + normal * 0.003;\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let lightSample = sample_environment_importance(vec2<f32>(\n random01(mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 41u)),\n random01(mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 43u))\n ));\n if (lightSample.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let lightDirection = safe_normalize(lightSample.direction, normal);\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, 1000000.0)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance = direct_environment_radiance(origin, lightDirection);\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 =\n ray.throughput.xyz *\n bsdf *\n incidentRadiance *\n (nDotL * misWeight / max(lightSample.pdf, 0.000001));\n return clamp_sample_radiance(contribution);\n}\n\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 triangles[triangleIndex] = TriangleRecord(\n triangleIndex,\n mesh.meshId,\n mesh.materialKind,\n mesh.flags,\n mesh.materialRefId,\n mesh.mediumRefId,\n mesh.materialSlot,\n 0u,\n vec4<f32>(vertex0.position.xyz, 0.0),\n vec4<f32>(vertex1.position.xyz, 0.0),\n vec4<f32>(vertex2.position.xyz, 0.0),\n vec4<f32>(n0, 0.0),\n vec4<f32>(n1, 0.0),\n vec4<f32>(n2, 0.0),\n vec4<f32>(uv0, uv1),\n vec4<f32>(uv2, 0.0, 0.0),\n mesh.color,\n mesh.emission,\n mesh.material,\n mesh.materialResponse,\n mesh.materialExtension,\n mesh.specularColor,\n mesh.baseColorAtlas,\n mesh.metallicRoughnessAtlas,\n mesh.normalAtlas,\n mesh.occlusionAtlas,\n mesh.emissiveAtlas,\n mesh.textureSettings\n );\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 jitterX = random01(mix_seed(sourcePixelId, sampleId, 0u, config.frameIndex, 1u)) - 0.5;\n let jitterY = random01(mix_seed(sourcePixelId, sampleId, 0u, config.frameIndex, 2u)) - 0.5;\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 );\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 0u\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 0u\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\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 clamp_sample_radiance(value: vec3<f32>) -> vec3<f32> {\n return min(max(value, vec3<f32>(0.0)), vec3<f32>(4.0));\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 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 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 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 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, 1.0, 0.0, 0.0),\n vec4<f32>(0.0, 1.0, 0.0, 0.0),\n vec4<f32>(0.0, 1.0, 0.0, 0.0),\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 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 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 offset_origin(position: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n return position + normal * 0.0025;\n}\n\nfn random_unit_vector(seed: u32) -> vec3<f32> {\n let z = random01(seed) * 2.0 - 1.0;\n let a = random01(seed + 11u) * 6.28318530718;\n let r = sqrt(max(0.0, 1.0 - z * z));\n return vec3<f32>(r * cos(a), r * sin(a), z);\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 sample_emissive_triangle_direction(hit: HitRecord, seed: u32, fallback: vec3<f32>) -> vec3<f32> {\n if (config.emissiveTriangleCount == 0u) {\n return fallback;\n }\n let lightSlot = min(u32(random01(seed + 71u) * f32(config.emissiveTriangleCount)), config.emissiveTriangleCount - 1u);\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let triangleIndex = lightMetadata.childOrFirst;\n if (triangleIndex >= config.triangleCount) {\n return fallback;\n }\n\n let lightTriangle = triangles[triangleIndex];\n let r1 = random01(seed + 101u);\n let r2 = random01(seed + 193u);\n let root = sqrt(r1);\n let b0 = 1.0 - root;\n let b1 = root * (1.0 - r2);\n let b2 = root * r2;\n let lightPoint =\n lightTriangle.v0.xyz * b0 +\n lightTriangle.v1.xyz * b1 +\n lightTriangle.v2.xyz * b2;\n return safe_normalize(lightPoint - hit.position.xyz, fallback);\n}\n\nfn sample_environment_portal_direction(hit: HitRecord, seed: u32, fallback: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return fallback;\n }\n let portalSlot = min(\n u32(random01(seed + 211u) * f32(config.environmentPortalCount)),\n config.environmentPortalCount - 1u\n );\n let portal = environmentPortals[portalSlot];\n let u = (random01(seed + 223u) * 2.0 - 1.0) * portal.tangent.w;\n let v = (random01(seed + 227u) * 2.0 - 1.0) * 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, seed: u32) -> ScatterResult {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\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_FLAG_DELTA_SAMPLE,\n 0u,\n 0u\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 if (cannotRefract || random01(seed + 23u) < transmissionReflectChance) {\n return ScatterResult(\n vec4<f32>(reflect(ray.direction.xyz, normal), 0.0),\n 1.0,\n RAY_FLAG_DELTA_SAMPLE,\n 0u,\n 0u\n );\n }\n return ScatterResult(\n vec4<f32>(refract_direction(ray.direction.xyz, normal, etaRatio), 0.0),\n 1.0,\n RAY_FLAG_DELTA_SAMPLE,\n 0u,\n 0u\n );\n }\n\n let guidedEmissiveAvailable = config.emissiveTriangleCount > 0u;\n let guidedPortalAvailable =\n config.environmentPortalCount > 0u && config.environmentPortalMode != 0u;\n let guidedSelector = random01(seed + 17u);\n if (guidedEmissiveAvailable && guidedSelector < 0.18) {\n let guidedDirection = sample_emissive_triangle_direction(hit, seed + 101u, normal);\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_FLAG_GUIDED_EMISSIVE,\n 0u,\n 0u\n );\n }\n }\n if (guidedPortalAvailable && guidedSelector < 0.32) {\n let guidedDirection = sample_environment_portal_direction(hit, seed + 131u, normal);\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(vec4<f32>(guidedDirection, 0.0), guidedPdf, 0u, 0u, 0u);\n }\n }\n\n let weights = surface_bsdf_sampling_weights(hit);\n let selector = random01(seed + 31u);\n var lightDirection = normal;\n if (selector < weights.x) {\n lightDirection = cosine_sample_hemisphere(\n vec2<f32>(random01(seed + 37u), random01(seed + 41u)),\n normal\n );\n } else if (selector < weights.x + weights.y) {\n let halfVector = importance_sample_ggx(\n vec2<f32>(random01(seed + 47u), random01(seed + 53u)),\n max(roughness, 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n } else {\n let halfVector = importance_sample_ggx(\n vec2<f32>(random01(seed + 59u), random01(seed + 61u)),\n max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n }\n if (dot(normal, lightDirection) <= 0.000001) {\n lightDirection = cosine_sample_hemisphere(\n vec2<f32>(random01(seed + 67u), random01(seed + 71u)),\n normal\n );\n }\n let pdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, lightDirection), 0.000001);\n return ScatterResult(vec4<f32>(lightDirection, 0.0), pdf, 0u, 0u, 0u);\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 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 let sourceRadiance = max(hit.emission.xyz, hit.color.xyz) * guidedLightWeight;\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, sourceRadiance);\n } else {\n contribution = clamp_sample_radiance(ray.throughput.xyz * sourceRadiance);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(contribution * sample_weight(), 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(ray, sourceRadiance);\n } else {\n contribution = clamp_sample_radiance(ray.throughput.xyz * sourceRadiance);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(contribution * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let response = stabilize_surface_path_response(ray, hit, surface_path_response(hit));\n record_deferred_path_response(ray, response);\n\n let shouldEstimateDirectEnvironment =\n (hit.materialKind == 0u || hit.materialKind == 1u) &&\n hit.material.z >= 0.95 &&\n ray.bounce < 2u;\n if (shouldEstimateDirectEnvironment) {\n let directEnvironment = surface_direct_environment_contribution(ray, hit);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(directEnvironment * sample_weight(), 0.0);\n }\n\n if (ray.bounce + 1u >= config.maxDepth) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, terminal_surface_environment_source(ray, hit));\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(ray, hit);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(terminalEnvironment * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let seed = mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 11u);\n let scatter = scatter_direction(ray, hit, seed);\n let nextIndex = atomicAdd(&counters.nextCount, 1u);\n if (nextIndex >= config.tilePixelCount) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, terminal_surface_environment_source(ray, hit));\n } else {\n let overflowEnvironment = terminal_surface_environment_contribution(ray, hit);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(overflowEnvironment * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n let throughput = ray.throughput.xyz * response;\n nextQueue[nextIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n ray.mediumRefId,\n scatter.flags,\n 0u,\n vec4<f32>(offset_origin(hit.position.xyz, hit.shadingNormal.xyz), 1.0),\n scatter.direction,\n vec4<f32>(throughput, scatter.pdf)\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 response = pathVertices[path_vertex_index(rayId, depth)];\n if (response.w > 0.0) {\n radiance = radiance * response.xyz;\n }\n }\n return clamp_sample_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 resolved = resolve_deferred_path_radiance(index) * sample_weight();\n radiance = clamp_sample_radiance(radiance + resolved);\n accumulation[index] = vec4<f32>(radiance, 1.0);\n }\n\n textureStore(radianceImage, pixel, vec4<f32>(radiance, 1.0));\n if (config.denoise == 0u) {\n textureStore(outputImage, pixel, vec4<f32>(tone_map_radiance(radiance), 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>(tone_map_radiance(radiance), 1.0));\n}\n`;\n\nconst 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\nfunction createWavefrontDeviceDescriptor(adapter, options = {}) {\n const requiredLimits = { ...(options.requiredLimits ?? {}) };\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 descriptor = { ...(options.deviceDescriptor ?? {}) };\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\nfunction 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 }),\n configuredWorkgroupSize: WORKGROUP_SIZE,\n });\n}\n\nfunction 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\nfunction nowMs() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction estimateSubmittedGpuWorkTimeoutMs(config, tileCount, overrideTimeoutMs = null) {\n if (Number.isFinite(overrideTimeoutMs)) {\n return Math.max(1, Math.trunc(Number(overrideTimeoutMs)));\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 return Math.min(\n GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS,\n GPU_SUBMITTED_WORK_TIMEOUT_MS + estimatedPasses * 5\n );\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(createWavefrontDeviceDescriptor(adapter, options));\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 });\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 rayQueueBytes = config.tilePixelCapacity * RAY_RECORD_BYTES;\n const hitBytes = config.tilePixelCapacity * HIT_RECORD_BYTES;\n const accumulationBytes = config.tilePixelCapacity * ACCUMULATION_RECORD_BYTES;\n const pathVertexBytes = config.tilePixelCapacity * (config.maxDepth + 1) * PATH_VERTEX_RECORD_BYTES;\n const activeQueue = createBuffer(device, bufferUsage, rayQueueBytes, \"plasius.wavefront.activeQueue\");\n const nextQueue = createBuffer(device, bufferUsage, rayQueueBytes, \"plasius.wavefront.nextQueue\");\n const hitBuffer = createBuffer(device, bufferUsage, hitBytes, \"plasius.wavefront.hitBuffer\");\n const accumulationBuffer = createBuffer(\n device,\n bufferUsage,\n accumulationBytes,\n \"plasius.wavefront.accumulation\"\n );\n const pathVertexBuffer = createBuffer(\n device,\n bufferUsage,\n pathVertexBytes,\n \"plasius.wavefront.pathVertices\"\n );\n const sceneObjectBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n config.sceneObjectCapacity * SCENE_OBJECT_RECORD_BYTES,\n \"plasius.wavefront.sceneObjects\"\n );\n const triangleBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.triangleCapacity) * TRIANGLE_RECORD_BYTES,\n \"plasius.wavefront.triangles\"\n );\n const bvhNodeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.bvhNodeCapacity + config.emissiveTriangleCapacity) *\n BVH_NODE_RECORD_BYTES,\n \"plasius.wavefront.bvhNodes\"\n );\n const meshVertexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.vertices.count) * MESH_VERTEX_RECORD_BYTES,\n \"plasius.wavefront.meshVertices\"\n );\n const meshIndexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.indices.count) * 4,\n \"plasius.wavefront.meshIndices\"\n );\n const meshRangeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.meshes.count) * MESH_RANGE_RECORD_BYTES,\n \"plasius.wavefront.meshRanges\"\n );\n const environmentPortalBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.environmentPortalCapacity) * ENVIRONMENT_PORTAL_RECORD_BYTES,\n \"plasius.wavefront.environmentPortals\"\n );\n const bvhLeafRefBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.bvhLeafSortCapacity) * BVH_LEAF_REF_RECORD_BYTES,\n \"plasius.wavefront.bvhLeafRefs\"\n );\n const tiles = createTiles(config.width, config.height, config.tileSize);\n const uniformOffsetAlignment = Number(device?.limits?.minUniformBufferOffsetAlignment);\n const configBufferStride = alignTo(\n CONFIG_BUFFER_BYTES,\n Number.isFinite(uniformOffsetAlignment) && uniformOffsetAlignment > 0\n ? uniformOffsetAlignment\n : CONFIG_BUFFER_BYTES\n );\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 frameConfigSlotCount * configBufferStride,\n \"plasius.wavefront.frameConfig\"\n );\n const bvhBuildConfigSlots =\n 1 + config.bvhSortStages.length + config.bvhBuildLevels.length;\n const bvhBuildConfigBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n Math.max(1, bvhBuildConfigSlots) * configBufferStride,\n \"plasius.wavefront.bvhBuildConfig\"\n );\n const counterBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n COUNTER_BUFFER_BYTES,\n \"plasius.wavefront.counters\"\n );\n const activeDispatchBuffer = createBuffer(\n device,\n constants.buffer.INDIRECT | constants.buffer.COPY_DST,\n INDIRECT_DISPATCH_ARGS_BYTES,\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 config.emissiveTriangleIndices.indices.forEach((triangleIndex, index) => {\n const nodeOffset = (config.bvhNodeCapacity + index) * (BVH_NODE_RECORD_BYTES / 4);\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 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 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 traceBindGroupLayout = 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 ],\n });\n const accelerationBindGroupLayout = 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 denoiseRadianceBindGroupLayout = 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 denoiseResolveBindGroupLayout = 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 tracePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.tracePipelineLayout\",\n bindGroupLayouts: [traceBindGroupLayout],\n });\n const accelerationPipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.accelerationPipelineLayout\",\n bindGroupLayouts: [accelerationBindGroupLayout],\n });\n const denoiseRadiancePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseRadiancePipelineLayout\",\n bindGroupLayouts: [denoiseRadianceBindGroupLayout],\n });\n const denoiseResolvePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseResolvePipelineLayout\",\n bindGroupLayouts: [denoiseResolveBindGroupLayout],\n });\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 const pipelines = {\n prepareMeshTrianglesAndLeaves: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"prepareMeshTrianglesAndLeaves\",\n \"plasius.wavefront.prepareMeshTrianglesAndLeaves\"\n ),\n sortBvhLeafRefs: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"sortBvhLeafRefs\",\n \"plasius.wavefront.sortBvhLeafRefs\"\n ),\n writeSortedBvhLeaves: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"writeSortedBvhLeaves\",\n \"plasius.wavefront.writeSortedBvhLeaves\"\n ),\n buildBvhInternalLevel: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"buildBvhInternalLevel\",\n \"plasius.wavefront.buildBvhInternalLevel\"\n ),\n generatePrimaryRays: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"generatePrimaryRays\",\n \"plasius.wavefront.generatePrimaryRays\"\n ),\n intersectActiveQueue: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"intersectActiveQueue\",\n \"plasius.wavefront.intersectActiveQueue\"\n ),\n resolveSurfaceRecords: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"resolveSurfaceRecords\",\n \"plasius.wavefront.resolveSurfaceRecords\"\n ),\n compactAndSwapQueues: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"compactAndSwapQueues\",\n \"plasius.wavefront.compactAndSwapQueues\"\n ),\n accumulateTerminalRadiance: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"accumulateTerminalRadiance\",\n \"plasius.wavefront.accumulateTerminalRadiance\"\n ),\n denoiseLinearRadiance: await createComputePipeline(\n device,\n computeShader,\n denoiseRadiancePipelineLayout,\n \"denoiseLinearRadiance\",\n \"plasius.wavefront.denoiseLinearRadiance\"\n ),\n resolveDenoisedOutputImage: await createComputePipeline(\n device,\n computeShader,\n denoiseResolvePipelineLayout,\n \"resolveDenoisedOutputImage\",\n \"plasius.wavefront.resolveDenoisedOutputImage\"\n ),\n };\n\n function createTraceBindGroup(activeBuffer, nextBuffer, label, frameConfigBuffer = configBuffer) {\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 ],\n });\n }\n\n const bindGroups = [\n createTraceBindGroup(activeQueue, nextQueue, \"plasius.wavefront.bind.activeNext\"),\n createTraceBindGroup(nextQueue, activeQueue, \"plasius.wavefront.bind.nextActive\"),\n ];\n const bvhBuildBindGroup = 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 function createDenoiseRadianceBindGroup(inputView, targetView, label) {\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\n function createDenoiseResolveBindGroup(inputView, targetView, label) {\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\n const denoiseRadianceBindGroup = createDenoiseRadianceBindGroup(\n radianceView,\n denoiseScratchView,\n \"plasius.wavefront.bind.denoise.radianceToScratch\"\n );\n const denoiseResolveBindGroup = createDenoiseResolveBindGroup(\n denoiseScratchView,\n outputView,\n \"plasius.wavefront.bind.denoise.scratchToOutput\"\n );\n const denoiseDirectResolveBindGroup = createDenoiseResolveBindGroup(\n radianceView,\n outputView,\n \"plasius.wavefront.bind.denoise.radianceToOutput\"\n );\n\n const presentBindGroupLayout = 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 const presentShader = device.createShaderModule({\n label: \"plasius.wavefront.presentShader\",\n code: PRESENT_WGSL,\n });\n const presentPipeline = await 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 const presentBindGroup = 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 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\n function resolveRenderedSamplesPerPixel(renderOptions = {}, awaitGPUCompletion = true) {\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\n function createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n }) {\n lastGpuParallelism = createGpuParallelismDiagnostics(gpuAdapterParallelism, parallelismCounters);\n const commandSubmissions = frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0);\n return 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 sceneObjectCount: config.sceneObjectCount,\n triangleCount: config.triangleCount,\n emissiveTriangleCount: config.emissiveTriangleCount,\n environmentPortalCount: config.environmentPortalCount,\n environmentPortalMode: config.environmentPortalMode,\n environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\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: lastGpuParallelism,\n memory: config.memory,\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 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 accelerationBuilt = true;\n accelerationBuildCount += 1;\n return true;\n }\n\n function encodeTileSample(encoder, tile, configOffset, parallelism) {\n const generatePass = encoder.beginComputePass({\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 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 function encodeTileOutput(encoder, tile, configOffset, parallelism) {\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 function encodeDenoise(encoder, configOffset, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\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 function encodePresent(encoder) {\n const texture = context.getCurrentTexture();\n const passEncoder = encoder.beginRenderPass({\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 passEncoder.setPipeline(presentPipeline);\n passEncoder.setBindGroup(0, presentBindGroup);\n passEncoder.draw(3);\n passEncoder.end();\n }\n\n function dispatchFrame(frameIndex, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\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 encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n 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 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 encodeDenoise(\n batch.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n encodePresent(batch.reserve(1));\n return batch.flush();\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 });\n }\n\n async function waitForSubmittedGpuWork(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 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 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(() => settleTimeoutPromise({ status: \"timeout\" }), timeoutMs);\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 === \"timeout\") {\n if (!allowTimeout) {\n throw new Error(`Timed out after ${timeoutMs} ms waiting for submitted GPU work.`);\n }\n console.warn(\n `[plasius.wavefront] Submitted GPU work did not report completion within ${timeoutMs} ms; continuing.`\n );\n return false;\n }\n return true;\n }\n\n function dispatchFrameAwaitingGpu(\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel\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 let submissionCount = 0;\n\n for (const tile of tiles) {\n for (\n let sampleStart = 0;\n sampleStart < renderedSamplesPerPixel;\n sampleStart += sampleBatchSize\n ) {\n const sampleEnd = Math.min(renderedSamplesPerPixel, sampleStart + sampleBatchSize);\n const batch = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n let slot = 0;\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 encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n encodeTileOutput(batch.reserve(1), tile, configOffset, parallelism);\n }\n }\n if (!config.deferredPathResolve && sampleEnd >= renderedSamplesPerPixel) {\n const outputConfigOffset = writeFrameConfigSlot(slot, tile, frameIndex, {\n sampleIndex: 0,\n sampleWeight: 1 / renderedSamplesPerPixel,\n });\n encodeTileOutput(batch.reserve(1), tile, outputConfigOffset, parallelism);\n }\n batch.flush();\n submissionCount += batch.getSubmissionCount();\n }\n }\n\n const tail = createGpuSubmissionBatcher({\n device,\n frameIndex,\n maxFramePassesPerSubmission: config.maxFramePassesPerSubmission,\n startingSubmissionCount: submissionCount,\n });\n if (config.denoise) {\n const denoiseConfigOffset = writeFrameConfigSlot(\n 0,\n { x: 0, y: 0, width: config.width, height: config.height },\n frameIndex,\n { sampleIndex: 0, sampleWeight: 1 / renderedSamplesPerPixel }\n );\n encodeDenoise(\n tail.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n encodePresent(tail.reserve(1));\n tail.flush();\n submissionCount += tail.getSubmissionCount();\n return submissionCount;\n }\n\n async function readOutputProbe(optionsForProbe = {}) {\n const mapMode = constants.map;\n if (!mapMode) {\n throw new Error(\"GPUMapMode.READ is unavailable in this environment.\");\n }\n const x = clamp(readNonNegativeInteger(\"x\", optionsForProbe.x, Math.floor(config.width / 2)), 0, config.width - 1);\n const y = clamp(readNonNegativeInteger(\"y\", optionsForProbe.y, Math.floor(config.height / 2)), 0, config.height - 1);\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\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 submittedWorkTimeoutMs = estimateSubmittedGpuWorkTimeoutMs(\n { ...config, renderedSamplesPerPixel: samplingPlan.renderedSamplesPerPixel },\n tiles.length,\n renderOptions.submittedWorkTimeoutMs\n );\n const frameStartTimeMs = nowMs();\n const submissionWaitOptions = awaitGPUCompletion\n ? { timeoutMs: submittedWorkTimeoutMs, allowTimeout: false }\n : { timeoutMs: submittedWorkTimeoutMs };\n let frameStats;\n if (useThrottledHighSamplePath) {\n frame += 1;\n const frameIndex = frame + config.frameIndex;\n const parallelismCounters = createGpuParallelismCounters();\n const accelerationBuildSubmitted = dispatchGpuAccelerationBuild(frameIndex, parallelismCounters);\n const frameSubmissionCount = dispatchFrameAwaitingGpu(\n frameIndex,\n parallelismCounters,\n samplingPlan.renderedSamplesPerPixel\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 frameStats = renderOnce(renderOptions, samplingPlan);\n }\n if (awaitGPUCompletion) {\n await waitForSubmittedGpuWork(submissionWaitOptions);\n }\n const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n if (awaitGPUCompletion) {\n lastCompletedFrameTimeMs = frameTimeMs;\n lastCompletedSamplesPerPixel = frameStats.renderedSamplesPerPixel ?? frameStats.samplesPerPixel;\n }\n frameStats = Object.freeze({\n ...frameStats,\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n frameStats.gpuParallelism,\n frameStats.commandSubmissions,\n frameTimeMs,\n awaitGPUCompletion\n ),\n });\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 return 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: Object.freeze({\n emissive: 0,\n environment: 0,\n ambientFallback: 0,\n maxDepth: 0,\n }),\n queueOverflow: 0,\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 frameIndex: config.frameIndex,\n ...overrides,\n });\n }\n\n function updateSceneObjects(sceneObjects) {\n const nextPackedScene = packWavefrontSceneObjects(sceneObjects, config.sceneObjectCapacity);\n packedScene = nextPackedScene;\n config = rebuildLiveConfig();\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 environmentMap: createEnvironmentMapSnapshot(config.environmentMap),\n deferredPathResolve: config.deferredPathResolve,\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 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 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 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 function createWavefrontPathTracingComputeShaderSource(options = {}) {\n const workgroupSize = readPositiveInteger(\n \"workgroupSize\",\n options.workgroupSize ?? rendererWavefrontComputeWorkgroupSize,\n rendererWavefrontComputeWorkgroupSize\n );\n if (workgroupSize !== rendererWavefrontComputeWorkgroupSize) {\n throw new Error(`wavefront mesh compute currently requires workgroupSize=${rendererWavefrontComputeWorkgroupSize}.`);\n }\n return WAVEFRONT_COMPUTE_WGSL;\n}\n","const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nconst DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\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 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\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 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 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 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\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 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\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\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 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\nfunction 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\nfunction 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\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 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 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 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"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsyE/B,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCrB,SAAS,gCAAgC,SAAS,UAAU,CAAC,GAAG;AAC9D,QAAM,iBAAiB,EAAE,GAAI,QAAQ,kBAAkB,CAAC,EAAG;AAC3D,QAAM,4BAA4B,OAAO,SAAS,QAAQ,+BAA+B;AACzF,MAAI,OAAO,SAAS,yBAAyB,GAAG;AAC9C,QAAI,4BAA4B,+BAA+B;AAC7D,YAAM,IAAI;AAAA,QACR,oEAAoE,6BAA6B,8BACnE,yBAAyB;AAAA,MACzD;AAAA,IACF;AACA,mBAAe,kCAAkC,KAAK;AAAA,MACpD,OAAO,eAAe,mCAAmC,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,EAAE,GAAI,QAAQ,oBAAoB,CAAC,EAAG;AACzD,MAAI,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC1C,eAAW,iBAAiB;AAAA,MAC1B,GAAI,WAAW,kBAAkB,CAAC;AAAA,MAClC,GAAG;AAAA,IACL;AAAA,EACF;AACA,SAAO,OAAO,KAAK,UAAU,EAAE,SAAS,IAAI,aAAa;AAC3D;AAEA,SAAS,aAAa,SAAS,QAAQ,MAAM;AAC3C,QAAM,eAAe,OAAO,SAAS,SAAS,IAAI,CAAC;AACnD,MAAI,OAAO,SAAS,YAAY,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,cAAc,OAAO,QAAQ,SAAS,IAAI,CAAC;AACjD,SAAO,OAAO,SAAS,WAAW,IAAI,cAAc;AACtD;AAEA,SAAS,0BAA0B,SAAS;AAC1C,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,IACxD,cAAc,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AAAA,IAC1E,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,IACxD,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,EACzE,CAAC;AACH;AAEA,SAAS,uCAAuC,SAAS,QAAQ;AAC/D,SAAO,OAAO,OAAO;AAAA,IACnB,mBAAmB;AAAA,IACnB,4BAA4B;AAAA,IAC5B,oCAAoC;AAAA,IACpC,aAAa,0BAA0B,OAAO;AAAA,IAC9C,eAAe,OAAO,OAAO;AAAA,MAC3B,mCAAmC,aAAa,SAAS,QAAQ,mCAAmC;AAAA,MACpG,0BAA0B,aAAa,SAAS,QAAQ,0BAA0B;AAAA,MAClF,0BAA0B,aAAa,SAAS,QAAQ,0BAA0B;AAAA,MAClF,0BAA0B,aAAa,SAAS,QAAQ,0BAA0B;AAAA,MAClF,kCAAkC,aAAa,SAAS,QAAQ,kCAAkC;AAAA,MAClG,iCAAiC,aAAa,SAAS,QAAQ,iCAAiC;AAAA,MAChG,6BAA6B,aAAa,SAAS,QAAQ,6BAA6B;AAAA,IAC1F,CAAC;AAAA,IACD,yBAAyB;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,6BAA6B,gBAAgB;AACpD,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,eAAe;AAAA,IACxB,OAAO,eAAe;AAAA,IACtB,QAAQ,eAAe;AAAA,IACvB,eAAe,eAAe,iBAAiB;AAAA,IAC/C,YAAY,eAAe;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,iBAAiB,eAAe;AAAA,IAChC,iBAAiB,eAAe;AAAA,IAChC,mBAAmB,eAAe,sBAAsB;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,QAAQ;AACf,MAAI,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,YAAY;AAC/E,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,SAAO,KAAK,IAAI;AAClB;AAEA,SAAS,kCAAkC,QAAQ,WAAW,oBAAoB,MAAM;AACtF,MAAI,OAAO,SAAS,iBAAiB,GAAG;AACtC,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAAA,EAC1D;AACA,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,OAAO,QAAQ,2BAA2B,QAAQ,mBAAmB,CAAC;AAAA,EACxE;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,QAAQ,YAAY,CAAC,CAAC;AAC1D,QAAM,wBAAwB,QAAQ,sBAAsB,IAAI;AAChE,QAAM,gBAAgB,QAAQ,UAAW,kBAAkB,IAAI,IAAI,IAAK;AACxE,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,aAAa,CAAC,CAAC;AAChD,QAAM,kBACJ,SAAS,mBAAmB,WAAW,IAAI,yBAAyB,gBAAgB;AACtF,SAAO,KAAK;AAAA,IACV;AAAA,IACA,gCAAgC,kBAAkB;AAAA,EACpD;AACF;AAEA,eAAsB,0CAA0C,UAAU,CAAC,GAAG;AAC5E,qCAAmC,OAAO;AAC1C,QAAM,YAAY,qBAAqB;AACvC,QAAM,eAAe,QAAQ,aAAa,WAAW;AACrD,MAAI,CAAC,oCAAoC,EAAE,WAAW,aAAa,CAAC,GAAG;AACrE,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,SAAS,cAAc,QAAQ,QAAQ,QAAQ,QAAQ;AAC7D,QAAM,gBAAgB,wCAAwC;AAAA,IAC5D,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACD,QAAM,UAAU,MAAM,aAAa,IAAI,eAAe;AAAA,IACpD,iBAAiB,QAAQ,mBAAmB;AAAA,EAC9C,CAAC;AACD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc,gCAAgC,SAAS,OAAO,CAAC;AAC5F,QAAM,wBAAwB,uCAAuC,SAAS,MAAM;AACpF,QAAM,UAAU,OAAO,WAAW,QAAQ;AAC1C,MAAI,CAAC,WAAW,OAAO,QAAQ,cAAc,YAAY;AACvD,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,QAAM,SACJ,QAAQ,WACP,OAAO,aAAa,IAAI,6BAA6B,aAClD,aAAa,IAAI,yBAAyB,IAC1C;AACN,MAAI,SAAS;AACb,QAAM,eAAe,uBAAuB,QAAQ,MAAM;AAC1D,MAAI,iBAAiB,OAAO,UAAU;AACpC,aAAS,wCAAwC;AAAA,MAC/C,GAAG;AAAA,MACH;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,OAAO;AACtB,SAAO,SAAS,OAAO;AACvB,UAAQ,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA,WAAW,QAAQ,UAAU,OAAO,kBAAkB;AAAA,EACxD,CAAC;AAED,QAAM,cAAc,UAAU,OAAO,UAAU,UAAU,OAAO;AAChE,QAAM,gBAAgB,OAAO,oBAAoB;AACjD,QAAM,WAAW,OAAO,oBAAoB;AAC5C,QAAM,oBAAoB,OAAO,oBAAoB;AACrD,QAAM,kBAAkB,OAAO,qBAAqB,OAAO,WAAW,KAAK;AAC3E,QAAM,cAAc,aAAa,QAAQ,aAAa,eAAe,+BAA+B;AACpG,QAAM,YAAY,aAAa,QAAQ,aAAa,eAAe,6BAA6B;AAChG,QAAM,YAAY,aAAa,QAAQ,aAAa,UAAU,6BAA6B;AAC3F,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,OAAO,sBAAsB;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,gBAAgB,IAAI;AAAA,IACvC;AAAA,EACF;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,kBAAkB,OAAO,wBAAwB,IAClE;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,cAAc,SAAS,KAAK,IAAI;AAAA,IACnD;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,cAAc,QAAQ,KAAK,IAAI;AAAA,IAClD;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,cAAc,OAAO,KAAK,IAAI;AAAA,IACjD;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,yBAAyB,IAAI;AAAA,IAChD;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,OAAO,mBAAmB,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,QAAQ,YAAY,OAAO,OAAO,OAAO,QAAQ,OAAO,QAAQ;AACtE,QAAM,yBAAyB,OAAO,QAAQ,QAAQ,+BAA+B;AACrF,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA,OAAO,SAAS,sBAAsB,KAAK,yBAAyB,IAChE,yBACA;AAAA,EACN;AACA,QAAM,wBAAwB,OAAO,sBAAsB,IAAI,MAAM;AACrE,QAAM,uBAAuB,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,SAAS,OAAO,kBAAkB,yBAAyB,OAAO,UAAU,IAAI;AAAA,EACxF;AACA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,uBAAuB;AAAA,IACvB;AAAA,EACF;AACA,QAAM,sBACJ,IAAI,OAAO,cAAc,SAAS,OAAO,eAAe;AAC1D,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO;AAAA,IAC5C,KAAK,IAAI,GAAG,mBAAmB,IAAI;AAAA,IACnC;AAAA,EACF;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,UAAU,OAAO,UAAU,UAAU,OAAO,WAAW,UAAU,OAAO;AAAA,IACxE;AAAA,IACA;AAAA,EACF;AACA,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA,UAAU,OAAO,WAAW,UAAU,OAAO;AAAA,IAC7C;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc,0BAA0B,OAAO,cAAc,OAAO,mBAAmB;AAC3F,SAAO,MAAM,YAAY,mBAAmB,GAAG,YAAY,MAAM;AACjE,QAAM,kBAAkB;AAAA,IACtB,OAAO,iBAAiB;AAAA,IACxB,KAAK,IAAI,GAAG,OAAO,gBAAgB;AAAA,EACrC;AACA,QAAM,iBAAiB;AAAA,IACrB,OAAO,iBAAiB;AAAA,IACxB,KAAK,IAAI,GAAG,OAAO,kBAAkB,OAAO,wBAAwB;AAAA,EACtE;AACA,QAAM,qBAAqB,IAAI,YAAY,eAAe,MAAM;AAChE,SAAO,wBAAwB,QAAQ,QAAQ,CAAC,eAAe,UAAU;AACvE,UAAM,cAAc,OAAO,kBAAkB,UAAU,wBAAwB;AAC/E,uBAAmB,aAAa,CAAC,IAAI;AAAA,EACvC,CAAC;AACD,SAAO,MAAM,YAAY,gBAAgB,GAAG,gBAAgB,MAAM;AAClE,SAAO,MAAM,YAAY,eAAe,GAAG,eAAe,MAAM;AAChE,SAAO,MAAM,YAAY,kBAAkB,GAAG,OAAO,cAAc,SAAS,MAAM;AAClF,SAAO,MAAM,YAAY,iBAAiB,GAAG,OAAO,cAAc,QAAQ,MAAM;AAChF,SAAO,MAAM,YAAY,iBAAiB,GAAG,OAAO,cAAc,OAAO,MAAM;AAC/E,QAAM,2BAA2B;AAAA,IAC/B,OAAO;AAAA,IACP,KAAK,IAAI,GAAG,OAAO,yBAAyB;AAAA,EAC9C;AACA,SAAO,MAAM,YAAY,yBAAyB,GAAG,yBAAyB,MAAM;AAEpF,QAAM,kBAAkB,OAAO,cAAc;AAAA,IAC3C,OAAO;AAAA,IACP,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,IACnD,QAAQ;AAAA,IACR,OACE,UAAU,QAAQ,kBAClB,UAAU,QAAQ;AAAA,EACtB,CAAC;AACD,QAAM,eAAe,gBAAgB,WAAW;AAChD,QAAM,wBAAwB,OAAO,cAAc;AAAA,IACjD,OAAO;AAAA,IACP,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,IACnD,QAAQ;AAAA,IACR,OACE,UAAU,QAAQ,kBAClB,UAAU,QAAQ;AAAA,EACtB,CAAC;AACD,QAAM,qBAAqB,sBAAsB,WAAW;AAC5D,QAAM,gBAAgB,OAAO,cAAc;AAAA,IACzC,OAAO;AAAA,IACP,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,IACnD,QAAQ;AAAA,IACR,OACE,UAAU,QAAQ,kBAClB,UAAU,QAAQ,kBAClB,UAAU,QAAQ;AAAA,EACtB,CAAC;AACD,QAAM,aAAa,cAAc,WAAW;AAC5C,QAAM,UAAU,OAAO,cAAc;AAAA,IACnC,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AACD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,QAAM,8BAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,WAAS,OAAO,OAAO;AAAA,IACrB,GAAG;AAAA,IACH,gBAAgB,OAAO,OAAO;AAAA,MAC5B,GAAG,OAAO;AAAA,MACV,OAAO,uBAAuB;AAAA,MAC9B,QAAQ,uBAAuB;AAAA,MAC/B,eAAe,uBAAuB;AAAA,MACtC,mBAAmB,4BAA4B;AAAA,IACjD,CAAC;AAAA,EACH,CAAC;AACD,QAAM,kBAAkB,sBAAsB,QAAQ,SAAS;AAC/D,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,EACF;AACA,QAAM,iCAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,EACF;AACA,QAAM,sBAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,EACF;AACA,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,EACF;AACA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,EACF;AACA,QAAM,uBAAuB,OAAO,cAAc;AAAA,IAChD,OAAO;AAAA,IACP,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AAED,QAAM,uBAAuB,OAAO,sBAAsB;AAAA,IACxD,OAAO;AAAA,IACP,SAAS;AAAA,MACP,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,oBAAoB,EAAE;AAAA,MAC1F;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,QAAQ,EAAE,MAAM,WAAW,kBAAkB,MAAM,gBAAgB,oBAAoB;AAAA,MACzF;AAAA,MACA,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,gBAAgB,EAAE,QAAQ,cAAc,QAAQ,aAAa;AAAA,MAC/D;AAAA,MACA,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,gBAAgB,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAChE;AAAA,MACA,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,oBAAoB,EAAE;AAAA,MAC3F,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,MAAM,YAAY,EAAE;AAAA,MACpF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MACjF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,MAAM,YAAY,EAAE;AAAA,MACpF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,MAAM,YAAY,EAAE;AAAA,MACpF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,IACxF;AAAA,EACF,CAAC;AACD,QAAM,8BAA8B,OAAO,sBAAsB;AAAA,IAC/D,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,QAAQ,EAAE,MAAM,WAAW,kBAAkB,MAAM,gBAAgB,oBAAoB;AAAA,MACzF;AAAA,MACA,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,MAChF,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,oBAAoB,EAAE;AAAA,MAC3F,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,oBAAoB,EAAE;AAAA,MAC3F,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,oBAAoB,EAAE;AAAA,MAC3F,EAAE,SAAS,IAAI,YAAY,UAAU,OAAO,SAAS,QAAQ,EAAE,MAAM,UAAU,EAAE;AAAA,IACnF;AAAA,EACF,CAAC;AACD,QAAM,iCAAiC,OAAO,sBAAsB;AAAA,IAClE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,QAAQ,EAAE,MAAM,WAAW,kBAAkB,MAAM,gBAAgB,oBAAoB;AAAA,MACzF;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,SAAS,EAAE,YAAY,QAAQ;AAAA,MACjC;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,gBAAgB,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAChE;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,gCAAgC,OAAO,sBAAsB;AAAA,IACjE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,QAAQ,EAAE,MAAM,WAAW,kBAAkB,MAAM,gBAAgB,oBAAoB;AAAA,MACzF;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,SAAS,EAAE,YAAY,QAAQ;AAAA,MACjC;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY,UAAU,OAAO;AAAA,QAC7B,gBAAgB,EAAE,QAAQ,cAAc,QAAQ,aAAa;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,sBAAsB,OAAO,qBAAqB;AAAA,IACtD,OAAO;AAAA,IACP,kBAAkB,CAAC,oBAAoB;AAAA,EACzC,CAAC;AACD,QAAM,6BAA6B,OAAO,qBAAqB;AAAA,IAC7D,OAAO;AAAA,IACP,kBAAkB,CAAC,2BAA2B;AAAA,EAChD,CAAC;AACD,QAAM,gCAAgC,OAAO,qBAAqB;AAAA,IAChE,OAAO;AAAA,IACP,kBAAkB,CAAC,8BAA8B;AAAA,EACnD,CAAC;AACD,QAAM,+BAA+B,OAAO,qBAAqB;AAAA,IAC/D,OAAO;AAAA,IACP,kBAAkB,CAAC,6BAA6B;AAAA,EAClD,CAAC;AACD,QAAM,gBAAgB,OAAO,mBAAmB;AAAA,IAC9C,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,QAAM,2BAA2B,eAAe,iCAAiC;AAEjF,QAAM,YAAY;AAAA,IAChB,+BAA+B,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,iBAAiB,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,uBAAuB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,qBAAqB,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,uBAAuB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,sBAAsB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,4BAA4B,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,uBAAuB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,4BAA4B,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,qBAAqB,cAAc,YAAY,OAAO,oBAAoB,cAAc;AAC/F,WAAO,OAAO,gBAAgB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,aAAa,EAAE;AAAA,QACjD,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,WAAW,EAAE;AAAA,QAC/C,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,UAAU,EAAE;AAAA,QAC9C,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,mBAAmB,EAAE;AAAA,QACvD,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,kBAAkB,EAAE;AAAA,QACtD,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,mBAAmB,MAAM,oBAAoB,EAAE;AAAA,QACjF,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,cAAc,EAAE;AAAA,QAClD,EAAE,SAAS,GAAG,UAAU,WAAW;AAAA,QACnC,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,eAAe,EAAE;AAAA,QACnD,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,cAAc,EAAE;AAAA,QAClD,EAAE,SAAS,IAAI,UAAU,aAAa;AAAA,QACtC,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,wBAAwB,EAAE;AAAA,QAC7D,EAAE,SAAS,IAAI,UAAU,uBAAuB,KAAK;AAAA,QACrD,EAAE,SAAS,IAAI,UAAU,uBAAuB,QAAQ;AAAA,QACxD,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,iBAAiB,EAAE;AAAA,QACtD,EAAE,SAAS,IAAI,UAAU,uBAAuB,KAAK;AAAA,QACrD,EAAE,SAAS,IAAI,UAAU,+BAA+B,KAAK;AAAA,QAC7D,EAAE,SAAS,IAAI,UAAU,oBAAoB,KAAK;AAAA,QAClD,EAAE,SAAS,IAAI,UAAU,uBAAuB,KAAK;AAAA,QACrD,EAAE,SAAS,IAAI,UAAU,sBAAsB,KAAK;AAAA,QACpD,EAAE,SAAS,IAAI,UAAU,qBAAqB;AAAA,QAC9C,EAAE,SAAS,IAAI,UAAU,gBAAgB,KAAK;AAAA,QAC9C,EAAE,SAAS,IAAI,UAAU,gBAAgB,QAAQ;AAAA,QACjD,EAAE,SAAS,IAAI,UAAU,4BAA4B,KAAK;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa;AAAA,IACjB,qBAAqB,aAAa,WAAW,mCAAmC;AAAA,IAChF,qBAAqB,WAAW,aAAa,mCAAmC;AAAA,EAClF;AACA,QAAM,oBAAoB,OAAO,gBAAgB;AAAA,IAC/C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,sBAAsB,MAAM,oBAAoB,EAAE;AAAA,MACpF,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,eAAe,EAAE;AAAA,MACnD,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,cAAc,EAAE;AAAA,MAClD,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,iBAAiB,EAAE;AAAA,MACtD,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,gBAAgB,EAAE;AAAA,MACrD,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,gBAAgB,EAAE;AAAA,MACrD,EAAE,SAAS,IAAI,UAAU,EAAE,QAAQ,iBAAiB,EAAE;AAAA,IACxD;AAAA,EACF,CAAC;AACD,WAAS,+BAA+B,WAAW,YAAY,OAAO;AACpE,WAAO,OAAO,gBAAgB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,cAAc,MAAM,oBAAoB,EAAE;AAAA,QAC5E,EAAE,SAAS,IAAI,UAAU,UAAU;AAAA,QACnC,EAAE,SAAS,IAAI,UAAU,WAAW;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,8BAA8B,WAAW,YAAY,OAAO;AACnE,WAAO,OAAO,gBAAgB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,cAAc,MAAM,oBAAoB,EAAE;AAAA,QAC5E,EAAE,SAAS,IAAI,UAAU,UAAU;AAAA,QACnC,EAAE,SAAS,IAAI,UAAU,WAAW;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,2BAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,gCAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,yBAAyB,OAAO,sBAAsB;AAAA,IAC1D,OAAO;AAAA,IACP,SAAS;AAAA,MACP,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,UAAU,SAAS,EAAE,YAAY,QAAQ,EAAE;AAAA,MACtF,EAAE,SAAS,GAAG,YAAY,UAAU,OAAO,UAAU,SAAS,EAAE,MAAM,YAAY,EAAE;AAAA,IACtF;AAAA,EACF,CAAC;AACD,QAAM,gBAAgB,OAAO,mBAAmB;AAAA,IAC9C,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,QAAM,kBAAkB,MAAM,qBAAqB,QAAQ;AAAA,IACzD,OAAO;AAAA,IACP,QAAQ,OAAO,qBAAqB;AAAA,MAClC,OAAO;AAAA,MACP,kBAAkB,CAAC,sBAAsB;AAAA,IAC3C,CAAC;AAAA,IACD,QAAQ,EAAE,QAAQ,eAAe,YAAY,aAAa;AAAA,IAC1D,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,SAAS,CAAC,EAAE,OAAO,CAAC;AAAA,IACtB;AAAA,IACA,WAAW,EAAE,UAAU,gBAAgB;AAAA,EACzC,CAAC;AACD,QAAM,mBAAmB,OAAO,gBAAgB;AAAA,IAC9C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAE,SAAS,GAAG,UAAU,WAAW;AAAA,MACnC,EAAE,SAAS,GAAG,UAAU,QAAQ;AAAA,IAClC;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACZ,MAAI,oBAAoB,CAAC,OAAO;AAChC,MAAI,yBAAyB;AAC7B,MAAI,sBAAsB,QAAQ,UAAU;AAC5C,MAAI,2BAA2B;AAC/B,MAAI,+BAA+B,KAAK,IAAI,GAAG,OAAO,eAAe;AACrE,MAAI,qBAAqB;AAAA,IACvB;AAAA,IACA,6BAA6B;AAAA,EAC/B;AAEA,WAAS,+BAA+B,gBAAgB,CAAC,GAAG,qBAAqB,MAAM;AACrF,UAAM,wBAAwB;AAAA,MAC5B;AAAA,QACE;AAAA,QACA,cAAc;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,UAAM,oBAAoB,OAAO,SAAS,cAAc,iBAAiB,IACrE,KAAK,IAAI,GAAG,OAAO,cAAc,iBAAiB,CAAC,IACnD;AACJ,UAAM,yBAAyB;AAAA,MAC7B;AAAA,QACE;AAAA,QACA,cAAc;AAAA,QACd,sBAAsB,QAAQ,wBAAwB,IAAI,IAAI;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,sBAAsB,QAAQ,CAAC,sBAAsB,yBAAyB,wBAAwB;AACxG,aAAO,OAAO,OAAO;AAAA,QACnB,yBAAyB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH;AACA,UAAM,wBACJ,OAAO,SAAS,wBAAwB,KAAK,2BAA2B,IACpE,2BAA2B,KAAK,IAAI,GAAG,4BAA4B,IACnE;AACN,QAAI,CAAC,OAAO,SAAS,qBAAqB,KAAK,yBAAyB,GAAG;AACzE,aAAO,OAAO,OAAO;AAAA,QACnB,yBAAyB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB,yBAAyB;AAAA,MAC9C,CAAC;AAAA,IACH;AACA,UAAM,uBAAuB;AAAA,MAC3B,KAAK,MAAM,oBAAoB,qBAAqB;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO,OAAO;AAAA,MACnB,yBAAyB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,uBAAuB;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,WAAS,iBAAiB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,yBAAqB,gCAAgC,uBAAuB,mBAAmB;AAC/F,UAAM,qBAAqB,wBAAwB,6BAA6B,IAAI;AACpF,WAAO,OAAO,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,6BAA6B,OAAO;AAAA,MACpC,YAAY,OAAO,QAAQ,OAAO;AAAA,MAClC,aAAa,OAAO,QAAQ,OAAO,SAAS;AAAA,MAC5C,kBAAkB,OAAO;AAAA,MACzB,eAAe,OAAO;AAAA,MACtB,uBAAuB,OAAO;AAAA,MAC9B,wBAAwB,OAAO;AAAA,MAC/B,uBAAuB,OAAO;AAAA,MAC9B,gBAAgB,6BAA6B,OAAO,cAAc;AAAA,MAClE,qBAAqB,OAAO;AAAA,MAC5B,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,MACvB,uBAAuB,OAAO;AAAA,MAC9B,8BAA8B,OAAO;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,WAAS,qBAAqB,MAAM,MAAM,YAAY,aAAa,CAAC,GAAG;AACrE,QAAI,QAAQ,sBAAsB;AAChC,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,UAAM,SAAS,OAAO;AACtB,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA,oBAAoB,QAAQ,MAAM,YAAY,UAAU;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB,YAAY;AAC3C,QAAI,OAAO;AACX,WAAO,CAAC,MAAM,aAAa,CAAC,MAAM;AAChC,YAAM,SAAS,qBAAqB,MAAM,MAAM,YAAY,UAAU;AACtE,cAAQ;AACR,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,6BAA6B,YAAY,aAAa;AAC7D,QAAI,CAAC,OAAO,gCAAgC,mBAAmB;AAC7D,aAAO;AAAA,IACT;AACA,UAAM,YAAY,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAChE,UAAM,UAAU,OAAO,qBAAqB;AAAA,MAC1C,OAAO,uCAAuC,UAAU;AAAA,IAC1D,CAAC;AACD,WAAO,MAAM;AAAA,MACX;AAAA,MACA;AAAA,MACA,oBAAoB,QAAQ,WAAW,YAAY;AAAA,QACjD,eAAe,OAAO;AAAA,MACxB,CAAC;AAAA,IACH;AACA,WAAO,cAAc,QAAQ,CAAC,WAAW,eAAe;AACtD,aAAO,MAAM;AAAA,QACX;AAAA,SACC,aAAa,KAAK;AAAA,QACnB,oBAAoB,QAAQ,WAAW,YAAY;AAAA,UACjD,OAAO,UAAU;AAAA,UACjB,OAAO,UAAU;AAAA,UACjB,eAAe,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,UAAM,wBAAwB,IAAI,OAAO,cAAc;AACvD,WAAO,eAAe,QAAQ,CAAC,YAAY,eAAe;AACxD,aAAO,MAAM;AAAA,QACX;AAAA,SACC,wBAAwB,cAAc;AAAA,QACvC,oBAAoB,QAAQ,WAAW,YAAY,UAAU;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,UAAM,cAAc,QAAQ,iBAAiB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AACD,gBAAY,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;AAClD,gBAAY,YAAY,UAAU,6BAA6B;AAC/D,UAAM,oBAAoB,KAAK,KAAK,OAAO,sBAAsB,cAAc;AAC/E,gBAAY,mBAAmB,iBAAiB;AAChD,yBAAqB,aAAa,CAAC,iBAAiB,GAAG,cAAc;AACrE,gBAAY,YAAY,UAAU,eAAe;AACjD,aAAS,aAAa,GAAG,aAAa,OAAO,cAAc,QAAQ,cAAc,GAAG;AAClF,kBAAY,aAAa,GAAG,mBAAmB;AAAA,SAC5C,aAAa,KAAK;AAAA,MACrB,CAAC;AACD,YAAM,iBAAiB,KAAK,KAAK,OAAO,sBAAsB,cAAc;AAC5E,kBAAY,mBAAmB,cAAc;AAC7C,2BAAqB,aAAa,CAAC,cAAc,GAAG,cAAc;AAAA,IACpE;AACA,gBAAY,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;AAClD,gBAAY,YAAY,UAAU,oBAAoB;AACtD,UAAM,sBAAsB,KAAK,KAAK,OAAO,gBAAgB,cAAc;AAC3E,gBAAY,mBAAmB,mBAAmB;AAClD,yBAAqB,aAAa,CAAC,mBAAmB,GAAG,cAAc;AACvE,gBAAY,YAAY,UAAU,qBAAqB;AACvD,aAAS,aAAa,GAAG,aAAa,OAAO,eAAe,QAAQ,cAAc,GAAG;AACnF,YAAM,aAAa,OAAO,eAAe,UAAU;AACnD,kBAAY,aAAa,GAAG,mBAAmB;AAAA,SAC5C,wBAAwB,cAAc;AAAA,MACzC,CAAC;AACD,YAAM,kBAAkB,KAAK,KAAK,WAAW,QAAQ,cAAc;AACnE,kBAAY,mBAAmB,eAAe;AAC9C,2BAAqB,aAAa,CAAC,eAAe,GAAG,cAAc;AAAA,IACrE;AACA,gBAAY,IAAI;AAChB,WAAO,MAAM,OAAO,CAAC,QAAQ,OAAO,CAAC,CAAC;AACtC,wBAAoB;AACpB,8BAA0B;AAC1B,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB,SAAS,MAAM,cAAc,aAAa;AAClE,UAAM,eAAe,QAAQ,iBAAiB;AAAA,MAC5C,OAAO;AAAA,IACT,CAAC;AACD,UAAM,iBAAiB,KAAK,KAAM,KAAK,QAAQ,KAAK,SAAU,cAAc;AAE5E,iBAAa,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;AAC1D,iBAAa,YAAY,UAAU,mBAAmB;AACtD,iBAAa,mBAAmB,cAAc;AAC9C,yBAAqB,aAAa,CAAC,cAAc,GAAG,cAAc;AAClE,iBAAa,IAAI;AAEjB,aAAS,cAAc,GAAG,cAAc,OAAO,UAAU,eAAe,GAAG;AACzE,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,QAAQ,iBAAiB;AAAA,QAC3C,OAAO,4BAA4B,WAAW;AAAA,MAChD,CAAC;AACD,kBAAY,aAAa,GAAG,WAAW,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;AACvE,kBAAY,YAAY,UAAU,oBAAoB;AACtD,kBAAY,2BAA2B,sBAAsB,CAAC;AAC9D,6BAAuB,aAAa,gBAAgB,cAAc;AAClE,kBAAY,YAAY,UAAU,qBAAqB;AACvD,kBAAY,2BAA2B,sBAAsB,CAAC;AAC9D,6BAAuB,aAAa,gBAAgB,cAAc;AAClE,kBAAY,YAAY,UAAU,oBAAoB;AACtD,kBAAY,mBAAmB,CAAC;AAChC,2BAAqB,aAAa,CAAC,CAAC,GAAG,CAAC;AACxC,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,WAAS,iBAAiB,SAAS,MAAM,cAAc,aAAa;AAClE,UAAM,cAAc,QAAQ,iBAAiB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AACD,UAAM,iBAAiB,KAAK,KAAM,KAAK,QAAQ,KAAK,SAAU,cAAc;AAE5E,gBAAY,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;AACzD,gBAAY,YAAY,UAAU,0BAA0B;AAC5D,gBAAY,mBAAmB,cAAc;AAC7C,yBAAqB,aAAa,CAAC,cAAc,GAAG,cAAc;AAClE,gBAAY,IAAI;AAAA,EAClB;AAEA,WAAS,cAAc,SAAS,cAAc,aAAa,0BAA0B,OAAO,iBAAiB;AAC3G,QAAI,CAAC,OAAO,SAAS;AACnB;AAAA,IACF;AACA,UAAM,qBAAqB,KAAK,KAAK,OAAO,QAAQ,CAAC;AACrD,UAAM,qBAAqB,KAAK,KAAK,OAAO,SAAS,CAAC;AACtD,UAAM,oBAAoB,0BAA0B;AACpD,QAAI,mBAAmB;AACrB,YAAM,eAAe,QAAQ,iBAAiB;AAAA,QAC5C,OAAO;AAAA,MACT,CAAC;AACD,mBAAa,aAAa,GAAG,0BAA0B,CAAC,YAAY,CAAC;AACrE,mBAAa,YAAY,UAAU,qBAAqB;AACxD,mBAAa,mBAAmB,oBAAoB,kBAAkB;AACtE;AAAA,QACE;AAAA,QACA,CAAC,oBAAoB,kBAAkB;AAAA,QACvC;AAAA,MACF;AACA,mBAAa,IAAI;AAAA,IACnB;AAEA,UAAM,cAAc,QAAQ,iBAAiB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AACD,gBAAY;AAAA,MACV;AAAA,MACA,oBAAoB,0BAA0B;AAAA,MAC9C,CAAC,YAAY;AAAA,IACf;AACA,gBAAY,YAAY,UAAU,0BAA0B;AAC5D,gBAAY,mBAAmB,oBAAoB,kBAAkB;AACrE;AAAA,MACE;AAAA,MACA,CAAC,oBAAoB,kBAAkB;AAAA,MACvC;AAAA,IACF;AACA,gBAAY,IAAI;AAAA,EAClB;AAEA,WAAS,cAAc,SAAS;AAC9B,UAAM,UAAU,QAAQ,kBAAkB;AAC1C,UAAM,cAAc,QAAQ,gBAAgB;AAAA,MAC1C,OAAO;AAAA,MACP,kBAAkB;AAAA,QAChB;AAAA,UACE,MAAM,QAAQ,WAAW;AAAA,UACzB,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,UACrC,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AACD,gBAAY,YAAY,eAAe;AACvC,gBAAY,aAAa,GAAG,gBAAgB;AAC5C,gBAAY,KAAK,CAAC;AAClB,gBAAY,IAAI;AAAA,EAClB;AAEA,WAAS,cAAc,YAAY,aAAa,0BAA0B,OAAO,iBAAiB;AAChG,UAAM,mBAAmB,wBAAwB,UAAU;AAC3D,UAAM,QAAQ,2BAA2B;AAAA,MACvC;AAAA,MACA;AAAA,MACA,6BAA6B,OAAO;AAAA,IACtC,CAAC;AAED,eAAW,QAAQ,OAAO;AACxB,eAAS,cAAc,GAAG,cAAc,yBAAyB,eAAe,GAAG;AACjF,cAAM,eAAe,iBAAiB,MAAM;AAAA,UAC1C;AAAA,UACA,cAAc,IAAI;AAAA,QACpB,CAAC;AACD;AAAA,UACE,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,OAAO,qBAAqB;AAC9B,2BAAiB,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,WAAW;AAAA,QACpE;AAAA,MACF;AACA,UAAI,CAAC,OAAO,qBAAqB;AAC/B,cAAM,qBAAqB,iBAAiB,MAAM;AAAA,UAChD,aAAa;AAAA,UACb,cAAc,IAAI;AAAA,QACpB,CAAC;AACD,yBAAiB,MAAM,QAAQ,CAAC,GAAG,MAAM,oBAAoB,WAAW;AAAA,MAC1E;AAAA,IACF;AACA,QAAI,OAAO,SAAS;AAClB,YAAM,sBAAsB;AAAA,QAC1B,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,QACzD,EAAE,aAAa,GAAG,cAAc,IAAI,wBAAwB;AAAA,MAC9D;AACA,YAAM,mBAAmB,0BAA0B,IAAI,IAAI;AAC3D;AAAA,QACE,MAAM,QAAQ,gBAAgB;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,kBAAc,MAAM,QAAQ,CAAC,CAAC;AAC9B,WAAO,MAAM,MAAM;AAAA,EACrB;AAEA,WAAS,WAAW,gBAAgB,CAAC,GAAG,uBAAuB,MAAM;AACnE,UAAM,mBAAmB,MAAM;AAC/B,aAAS;AACT,UAAM,aAAa,QAAQ,OAAO;AAClC,UAAM,eAAe,wBAAwB,+BAA+B,eAAe,KAAK;AAChG,UAAM,sBAAsB,6BAA6B;AACzD,UAAM,6BAA6B,6BAA6B,YAAY,mBAAmB;AAC/F,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AACA,UAAM,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB;AAC1D,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG,iBAAiB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,yBAAyB,aAAa;AAAA,QACtC,uBAAuB,aAAa;AAAA,QACpC,mBAAmB,aAAa;AAAA,QAChC,mBAAmB,aAAa;AAAA,MAClC,CAAC;AAAA,MACD,eAAe;AAAA,QACb;AAAA,QACA,wBAAwB,6BAA6B,IAAI;AAAA,QACzD;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAe,wBAAwBC,WAAU,CAAC,GAAG;AACnD,QAAI,OAAO,OAAO,MAAM,wBAAwB,YAAY;AAC1D,aAAO;AAAA,IACT;AACA,UAAM,YAAY,KAAK;AAAA,MACrB;AAAA,MACA,OAAO,SAASA,SAAQ,SAAS,IAC7B,OAAOA,SAAQ,SAAS,IACxB;AAAA,IACN;AACA,UAAM,eAAeA,SAAQ,iBAAiB;AAC9C,UAAM,oBAAoB,OAAO,MAAM,oBAAoB,EAAE;AAAA,MAC3D,OAAO,EAAE,QAAQ,OAAO;AAAA,MACxB,CAAC,UAAU;AACT,cAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,cACJ,OAAO,OAAO,MAAM,SAAS,aACzB,OAAO,KAAK,KAAK,CAAC,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,wDAAwD,MAAM,UAAU,SAAS;AAAA,MACnF;AAAA,IACF,CAAC,IACD;AACN,QAAI,gBAAgB;AACpB,QAAI,wBAAwB;AAC5B,QAAI,iBAAiB;AACrB,UAAM,uBAAuB,CAAC,UAAU;AACtC,UAAI,gBAAgB;AAClB;AAAA,MACF;AACA,uBAAiB;AACjB,8BAAwB,KAAK;AAAA,IAC/B;AACA,UAAM,iBAAiB,IAAI,QAAQ,CAAC,YAAY;AAC9C,8BAAwB;AACxB,sBAAgB,WAAW,MAAM,qBAAqB,EAAE,QAAQ,UAAU,CAAC,GAAG,SAAS;AAAA,IACzF,CAAC;AACD,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,QAAQ;AAAA,QACrB,CAAC,mBAAmB,gBAAgB,WAAW,EAAE,OAAO,OAAO;AAAA,MACjE;AAAA,IACF,UAAE;AACA,UAAI,kBAAkB,MAAM;AAC1B,qBAAa,aAAa;AAC1B,6BAAqB,EAAE,QAAQ,YAAY,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,WAAW;AAChC,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,mBAAmB,SAAS,qCAAqC;AAAA,MACnF;AACA,cAAQ;AAAA,QACN,2EAA2E,SAAS;AAAA,MACtF;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,yBACP,YACA,aACA,0BAA0B,OAAO,iBACjC;AACA,UAAM,wBAAwB,OAAO,WAAW,KAAK,OAAO,sBAAsB,IAAI;AACtF,UAAM,mBAAmB,OAAO,UAAW,0BAA0B,IAAI,IAAI,IAAK;AAClF,UAAM,gBAAgB,mBAAmB;AACzC,UAAM,kBAAkB,KAAK;AAAA,MAC3B;AAAA,MACA,KAAK;AAAA,QACH,KAAK,IAAI,OAAO,8BAA8B,eAAe,CAAC,IAC5D,KAAK,IAAI,uBAAuB,CAAC;AAAA,MACrC;AAAA,IACF;AACA,QAAI,kBAAkB;AAEtB,eAAW,QAAQ,OAAO;AACxB,eACM,cAAc,GAClB,cAAc,yBACd,eAAe,iBACf;AACA,cAAM,YAAY,KAAK,IAAI,yBAAyB,cAAc,eAAe;AACjF,cAAM,QAAQ,2BAA2B;AAAA,UACvC;AAAA,UACA;AAAA,UACA,6BAA6B,OAAO;AAAA,UACpC,yBAAyB;AAAA,QAC3B,CAAC;AACD,YAAI,OAAO;AACX,iBAAS,cAAc,aAAa,cAAc,WAAW,eAAe,GAAG;AAC7E,gBAAM,eAAe,qBAAqB,MAAM,MAAM,YAAY;AAAA,YAChE;AAAA,YACA,cAAc,IAAI;AAAA,UACpB,CAAC;AACD,kBAAQ;AACR;AAAA,YACE,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,OAAO,qBAAqB;AAC9B,6BAAiB,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,WAAW;AAAA,UACpE;AAAA,QACF;AACA,YAAI,CAAC,OAAO,uBAAuB,aAAa,yBAAyB;AACvE,gBAAM,qBAAqB,qBAAqB,MAAM,MAAM,YAAY;AAAA,YACtE,aAAa;AAAA,YACb,cAAc,IAAI;AAAA,UACpB,CAAC;AACD,2BAAiB,MAAM,QAAQ,CAAC,GAAG,MAAM,oBAAoB,WAAW;AAAA,QAC1E;AACA,cAAM,MAAM;AACZ,2BAAmB,MAAM,mBAAmB;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,OAAO,2BAA2B;AAAA,MACtC;AAAA,MACA;AAAA,MACA,6BAA6B,OAAO;AAAA,MACpC,yBAAyB;AAAA,IAC3B,CAAC;AACD,QAAI,OAAO,SAAS;AAClB,YAAM,sBAAsB;AAAA,QAC1B;AAAA,QACA,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAAA,QACzD;AAAA,QACA,EAAE,aAAa,GAAG,cAAc,IAAI,wBAAwB;AAAA,MAC9D;AACA;AAAA,QACE,KAAK,QAAQ,gBAAgB;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,kBAAc,KAAK,QAAQ,CAAC,CAAC;AAC7B,SAAK,MAAM;AACX,uBAAmB,KAAK,mBAAmB;AAC3C,WAAO;AAAA,EACT;AAEA,iBAAe,gBAAgB,kBAAkB,CAAC,GAAG;AACnD,UAAM,UAAU,UAAU;AAC1B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,UAAM,IAAI,MAAM,uBAAuB,KAAK,gBAAgB,GAAG,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC,GAAG,GAAG,OAAO,QAAQ,CAAC;AACjH,UAAM,IAAI,MAAM,uBAAuB,KAAK,gBAAgB,GAAG,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC,GAAG,GAAG,OAAO,SAAS,CAAC;AACnH,UAAM,WAAW,OAAO,aAAa;AAAA,MACnC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,UAAU,OAAO,WAAW,UAAU,OAAO;AAAA,IACtD,CAAC;AACD,UAAM,wBAAwB;AAAA,MAC5B,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,UAAU,OAAO,qBAAqB;AAAA,MAC1C,OAAO;AAAA,IACT,CAAC;AACD,YAAQ;AAAA,MACN,EAAE,SAAS,eAAe,QAAQ,EAAE,GAAG,EAAE,EAAE;AAAA,MAC3C,EAAE,QAAQ,UAAU,aAAa,KAAK,cAAc,EAAE;AAAA,MACtD,EAAE,OAAO,GAAG,QAAQ,GAAG,oBAAoB,EAAE;AAAA,IAC/C;AACA,WAAO,MAAM,OAAO,CAAC,QAAQ,OAAO,CAAC,CAAC;AACtC,UAAM,wBAAwB;AAAA,MAC5B,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,CAAC;AACD,UAAM,SAAS,SAAS,QAAQ,IAAI;AACpC,UAAM,QAAQ,IAAI,WAAW,SAAS,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC;AAClE,aAAS,MAAM;AACf,aAAS,UAAU;AACnB,WAAO,OAAO,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA,MAAM,OAAO,OAAO,MAAM,KAAK,KAAK,CAAC;AAAA,MACrC,YAAY,SAAS,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK;AAAA,IAC3E,CAAC;AAAA,EACH;AAEA,iBAAe,YAAY,gBAAgB,CAAC,GAAG;AAC7C,UAAM,qBAAqB,cAAc,uBAAuB;AAChE,UAAM,eAAe,+BAA+B,eAAe,kBAAkB;AACrF,UAAM,6BACJ,sBAAsB,aAAa,2BAA2B;AAChE,UAAM,yBAAyB;AAAA,MAC7B,EAAE,GAAG,QAAQ,yBAAyB,aAAa,wBAAwB;AAAA,MAC3E,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AACA,UAAM,mBAAmB,MAAM;AAC/B,UAAM,wBAAwB,qBAC1B,EAAE,WAAW,wBAAwB,cAAc,MAAM,IACzD,EAAE,WAAW,uBAAuB;AACxC,QAAI;AACJ,QAAI,4BAA4B;AAC9B,eAAS;AACT,YAAM,aAAa,QAAQ,OAAO;AAClC,YAAM,sBAAsB,6BAA6B;AACzD,YAAM,6BAA6B,6BAA6B,YAAY,mBAAmB;AAC/F,YAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,aAAa;AAAA,MACf;AACA,mBAAa,iBAAiB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,yBAAyB,aAAa;AAAA,QACtC,uBAAuB,aAAa;AAAA,QACpC,mBAAmB,aAAa;AAAA,QAChC,mBAAmB,aAAa;AAAA,MAClC,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,WAAW,eAAe,YAAY;AAAA,IACrD;AACA,QAAI,oBAAoB;AACtB,YAAM,wBAAwB,qBAAqB;AAAA,IACrD;AACA,UAAM,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,gBAAgB;AAC1D,QAAI,oBAAoB;AACtB,iCAA2B;AAC3B,qCAA+B,WAAW,2BAA2B,WAAW;AAAA,IAClF;AACA,iBAAa,OAAO,OAAO;AAAA,MACzB,GAAG;AAAA,MACH,eAAe;AAAA,QACb,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,QACJ,cAAc,oBAAoB,QAAQ,OAAO,MAAM,gBAAgB,cAAc,KAAK;AAC5F,UAAM,aAAa,QAAQ,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI;AACjE,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG;AAAA,MACH,aAAa,QACT,OAAO,OAAO;AAAA,QACZ,GAAG;AAAA,QACH,eAAe;AAAA,QACf,gBAAgB,aAAa,IAAI,IAAI;AAAA,QACrC;AAAA,MACF,CAAC,IACD;AAAA,MACJ,SAAS,CAAC;AAAA,MACV,aAAa,OAAO,OAAO;AAAA,QACzB,UAAU;AAAA,QACV,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,WAAS,kBAAkB,YAAY,CAAC,GAAG;AACzC,WAAO,wCAAwC;AAAA,MAC7C,GAAG;AAAA,MACH;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,qBAAqB,OAAO;AAAA,MAC5B,cAAc,YAAY;AAAA,MAC1B,QAAQ;AAAA,MACR,gBAAgB;AAAA,QACd,GAAG,OAAO;AAAA,MACZ;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,WAAS,mBAAmB,cAAc;AACxC,UAAM,kBAAkB,0BAA0B,cAAc,OAAO,mBAAmB;AAC1F,kBAAc;AACd,aAAS,kBAAkB;AAC3B,WAAO,MAAM,YAAY,mBAAmB,GAAG,YAAY,MAAM;AACjE,WAAO;AAAA,EACT;AAEA,WAAS,aAAa,gBAAgB,CAAC,GAAG;AACxC,0BAAsB;AACtB,aAAS,kBAAkB;AAC3B,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,WAAO,OAAO,OAAO;AAAA,MACnB;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,6BAA6B,OAAO;AAAA,MACpC,kBAAkB,OAAO;AAAA,MACzB,eAAe,OAAO;AAAA,MACtB,uBAAuB,OAAO;AAAA,MAC9B,wBAAwB,OAAO;AAAA,MAC/B,uBAAuB,OAAO;AAAA,MAC9B,gBAAgB,6BAA6B,OAAO,cAAc;AAAA,MAClE,qBAAqB,OAAO;AAAA,MAC5B,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,MACvB,uBAAuB,OAAO;AAAA,MAC9B,8BAA8B,OAAO;AAAA,MACrC;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,WAAS,UAAU;AACjB,gBAAY,UAAU;AACtB,cAAU,UAAU;AACpB,cAAU,UAAU;AACpB,uBAAmB,UAAU;AAC7B,qBAAiB,UAAU;AAC3B,sBAAkB,UAAU;AAC5B,mBAAe,UAAU;AACzB,kBAAc,UAAU;AACxB,qBAAiB,UAAU;AAC3B,oBAAgB,UAAU;AAC1B,oBAAgB,UAAU;AAC1B,4BAAwB,UAAU;AAClC,qBAAiB,UAAU;AAC3B,iBAAa,UAAU;AACvB,yBAAqB,UAAU;AAC/B,kBAAc,UAAU;AACxB,yBAAqB,UAAU;AAC/B,oBAAgB,UAAU;AAC1B,0BAAsB,UAAU;AAC5B,kBAAc,UAAU;AACxB,QAAI,uBAAuB,aAAa;AACtC,6BAAuB,SAAS,UAAU;AAAA,IAC5C;AACA,QAAI,4BAA4B,aAAa;AAC3C,kCAA4B,SAAS,UAAU;AAAA,IACjD;AACA,oBAAgB,SAAS,UAAU;AACnC,QAAI,uBAAuB,aAAa;AACtC,6BAAuB,SAAS,UAAU;AAAA,IAC5C;AACJ,QAAI,+BAA+B,aAAa;AAC9C,qCAA+B,SAAS,UAAU;AAAA,IACpD;AACA,QAAI,oBAAoB,aAAa;AACnC,0BAAoB,SAAS,UAAU;AAAA,IACzC;AACA,QAAI,uBAAuB,aAAa;AACtC,6BAAuB,SAAS,UAAU;AAAA,IAC5C;AACA,QAAI,sBAAsB,aAAa;AACrC,4BAAsB,SAAS,UAAU;AAAA,IAC3C;AACA,YAAQ,cAAc;AAAA,EACxB;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,uCAAuC,UAAU,CAAC,GAAG;AACzE,QAAM,WAAW,MAAM,0CAA0C,OAAO;AACxE,MAAI;AACF,WAAO,MAAM,SAAS,YAAY,OAAO;AAAA,EAC3C,UAAE;AACA,aAAS,QAAQ;AAAA,EACnB;AACF;AAEO,SAAS,8CAA8C,UAAU,CAAC,GAAG;AAC1E,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,QAAQ,iBAAiB;AAAA,IACzB;AAAA,EACF;AACA,MAAI,kBAAkB,uCAAuC;AAC3D,UAAM,IAAI,MAAM,2DAA2D,qCAAqC,GAAG;AAAA,EACrH;AACA,SAAO;AACT;;;AC79NA,IAAM,sBAAsB,OAAO,OAAO,CAAC,MAAM,MAAM,MAAM,CAAG,CAAC;AACjE,IAAM,0BAA0B;AA8BzB,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AACjC,IAAM,+BAA+B;AACrC,IAAM,8BAA8B,OAAO,OAAO;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,6CAA6C,OAAO,OAAO;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,+BAA+B,OAAO,OAAO;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,uCAAuC;AAC7C,IAAM,qCAAqC;AAC3C,IAAM,4BAA4B,OAAO,OAAO;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,6BAA6B,OAAO,OAAO;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,qCAAqC,OAAO;AAAA,EAChD,6BAA6B;AAAA,IAAI,CAAC,KAAK,UACrC,OAAO,OAAO;AAAA,MACZ;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,UAAU;AAAA,MACV,aACE;AAAA,QACE,mBAAmB;AAAA,QACnB,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,sBAAsB;AAAA,QACtB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,aAAa;AAAA,QACb,SAAS;AAAA,MACX,EAAE,GAAG;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEA,IAAM,qCAAqC,OAAO,OAAO;AAAA,EACvD,MAAM,OAAO,OAAO;AAAA,IAClB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,CAAC;AAAA,EACD,KAAK,OAAO,OAAO;AAAA,IACjB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,CAAC;AAAA,EACD,KAAK,OAAO,OAAO;AAAA,IACjB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,CAAC;AAAA,EACD,SAAS,OAAO,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,CAAC;AACH,CAAC;AAED,IAAM,wCAAwC,OAAO;AAAA,EACnD,2CAA2C;AAAA,IAAI,CAAC,gBAC9C,OAAO,OAAO;AAAA,MACZ;AAAA,MACA,aACE;AAAA,QACE,QAAQ;AAAA,QACR,iBACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,MACJ,EAAE,WAAW;AAAA,IACjB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sCAAsC,OAAO;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACrD;AAEO,SAAS,sCAAsC,UAAU,CAAC,GAAG;AAClE,QAAM,2BAA2B;AAAA,IAC/B,QAAQ,mBAAmB;AAAA,EAC7B;AACA,QAAM,yBAAyB,KAAK;AAAA,IAClC;AAAA,IACA,sCAAsC,QAAQ,0BAA0B,CAAC;AAAA,EAC3E;AACA,QAAM,oBAAoB,OAAO,SAAS,QAAQ,iBAAiB,IAC/D,KAAK,IAAI,GAAG,OAAO,QAAQ,iBAAiB,CAAC,IAC7C;AACJ,QAAM,SAAS,oBAAI,IAAI,CAAC,wBAAwB,wBAAwB,CAAC;AACzE,MAAI,yBAAyB;AAE7B,SAAO,yBAAyB,0BAA0B;AACxD,WAAO,IAAI,sBAAsB;AACjC,8BAA0B;AAAA,EAC5B;AAEA,SAAO,IAAI,KAAK,IAAI,wBAAwB,wBAAwB,CAAC;AAErE,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO;AAAA,MACb,CAAC,GAAG,MAAM,EACP,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK,EAClC;AAAA,QAAI,CAAC,oBACJ,OAAO,OAAO;AAAA,UACZ,IAAI,GAAG,eAAe;AAAA,UACtB,OAAO,GAAG,eAAe;AAAA,UACzB,iBAAiB;AAAA,UACjB,QAAQ,OAAO,OAAO;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAM,MAAM,aAAa;AACrD,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,mCAAmC,OAAO,OAAO;AAAA,EACrD,KAAK,OAAO,OAAO;AAAA,IACjB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,SAAS,OAAO,sDAAsD;AAAA,MAC3F,qBAAqB,eAAe,OAAO,iDAAiD;AAAA,MAC5F,qBAAqB,iBAAiB,OAAO,6CAA6C;AAAA,MAC1F,qBAAqB,YAAY,OAAO,yCAAyC;AAAA,MACjF,qBAAqB,UAAU,OAAO,iDAAiD;AAAA,MACvF,qBAAqB,UAAU,aAAa,qCAAqC;AAAA,MACjF,qBAAqB,aAAa,aAAa,mDAAmD;AAAA,MAClG,qBAAqB,cAAc,aAAa,gDAAgD;AAAA,MAChG,qBAAqB,eAAe,OAAO,iDAAiD;AAAA,MAC5F,qBAAqB,SAAS,OAAO,6DAA6D;AAAA,IACpG,CAAC;AAAA,EACH,CAAC;AAAA,EACD,KAAK,OAAO,OAAO;AAAA,IACjB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,SAAS,OAAO,8CAA8C;AAAA,MACnF,qBAAqB,iBAAiB,OAAO,uCAAuC;AAAA,MACpF,qBAAqB,WAAW,0BAA0B,KAAK,KAAK,GAAG,8DAA8D;AAAA,MACrI,qBAAqB,YAAY,OAAO,wCAAwC;AAAA,MAChF,qBAAqB,YAAY,OAAO,iCAAiC;AAAA,MACzE,qBAAqB,cAAc,OAAO,+BAA+B;AAAA,MACzE,qBAAqB,eAAe,OAAO,mCAAmC;AAAA,MAC9E,qBAAqB,cAAc,OAAO,8BAA8B;AAAA,MACxE,qBAAqB,gBAAgB,aAAa,qDAAqD;AAAA,MACvG,qBAAqB,MAAM,aAAa,qCAAqC;AAAA,MAC7E,qBAAqB,mBAAmB,aAAa,6BAA6B;AAAA,MAClF,qBAAqB,iBAAiB,aAAa,0CAA0C;AAAA,MAC7F,qBAAqB,aAAa,QAAQ,+DAA+D;AAAA,IAC3G,CAAC;AAAA,EACH,CAAC;AAAA,EACD,SAAS,OAAO,OAAO;AAAA,IACrB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,SAAS,OAAO,6CAA6C;AAAA,MAClF,qBAAqB,YAAY,OAAO,iCAAiC;AAAA,MACzE,qBAAqB,iBAAiB,OAAO,2DAA2D;AAAA,MACxG,qBAAqB,eAAe,OAAO,kDAAkD;AAAA,MAC7F,qBAAqB,mBAAmB,aAAa,mDAAmD;AAAA,MACxG,qBAAqB,iBAAiB,aAAa,uCAAuC;AAAA,MAC1F,qBAAqB,MAAM,aAAa,8BAA8B;AAAA,MACtE,qBAAqB,gBAAgB,eAAe,mDAAmD;AAAA,IACzG,CAAC;AAAA,EACH,CAAC;AAAA,EACD,mBAAmB,OAAO,OAAO;AAAA,IAC/B,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,iBAAiB,OAAO,oCAAoC;AAAA,MACjF,qBAAqB,cAAc,OAAO,kDAAkD;AAAA,MAC5F,qBAAqB,gBAAgB,OAAO,oCAAoC;AAAA,MAChF,qBAAqB,gBAAgB,OAAO,2CAA2C;AAAA,MACvF,qBAAqB,SAAS,OAAO,iDAAiD;AAAA,IACxF,CAAC;AAAA,EACH,CAAC;AAAA,EACD,iBAAiB,OAAO,OAAO;AAAA,IAC7B,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,eAAe,OAAO,kCAAkC;AAAA,MAC7E,qBAAqB,YAAY,OAAO,8CAA8C;AAAA,MACtF,qBAAqB,cAAc,OAAO,iCAAiC;AAAA,MAC3E,qBAAqB,cAAc,aAAa,gDAAgD;AAAA,MAChG,qBAAqB,cAAc,aAAa,gDAAgD;AAAA,IAClG,CAAC;AAAA,EACH,CAAC;AAAA,EACD,cAAc,OAAO,OAAO;AAAA,IAC1B,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ,OAAO,OAAO;AAAA,MACpB,qBAAqB,iBAAiB,OAAO,0CAA0C;AAAA,MACvF,qBAAqB,eAAe,OAAO,uCAAuC;AAAA,MAClF,qBAAqB,YAAY,aAAa,sDAAsD;AAAA,MACpG,qBAAqB,cAAc,aAAa,4DAA4D;AAAA,MAC5G,qBAAqB,cAAc,OAAO,yDAAyD;AAAA,IACrG,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC;AACzC,SAAO,OAAO,OAAO;AAAA,IACnB,kBAAkB,OAAO,OAAO,CAAC,YAAY,eAAe,MAAM,CAAC;AAAA,IACnE,sBAAsB,OAAO,OAAO,CAAC,WAAW,aAAa,CAAC;AAAA,IAC9D,UAAU,OAAO,OAAO;AAAA,MACtB,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB,CAAC;AAAA,IACD,aAAa,OAAO,OAAO;AAAA,MACzB,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB,CAAC;AAAA,IACD,MAAM,OAAO,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,qBAAqB;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,6BAA6B,UAAU;AAC9C,SAAO,OAAO;AAAA,IACZ,MAAM;AAAA,MAAK,EAAE,QAAQ,SAAS;AAAA,MAAG,CAAC,GAAG,UACnC,OAAO,OAAO;AAAA,QACZ,QAAQ;AAAA,QACR,WAAW,QAAQ,MAAM,IAAI,WAAW;AAAA,QACxC,YAAY,QAAQ,MAAM,IAAI,SAAS;AAAA,QACvC,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,+BAA+B,UAAU,CAAC,GAAG;AAC3D,QAAM,WACJ,QAAQ,aAAa,SACjB,IACAC,qBAAoB,YAAY,QAAQ,QAAQ;AACtD,QAAM,gBACJ,QAAQ,kBAAkB,SACtB,OACAA,qBAAoB,iBAAiB,QAAQ,aAAa;AAChE,QAAM,yBACJ,QAAQ,2BAA2B,SAC/B,IACAC,wBAAuB,0BAA0B,QAAQ,sBAAsB;AACrF,QAAM,wBAAwB,QAAQ,0BAA0B;AAEhE,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe;AAAA,IACf,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO,OAAO;AAAA,MACzB,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,QAAQ,OAAO,OAAO;AAAA,QACpB,OAAO,OAAO,EAAE,MAAM,UAAU,MAAM,iBAAiB,CAAC;AAAA,QACxD,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,MACrD,CAAC;AAAA,IACH,CAAC;AAAA,IACD,iBAAiB;AAAA,IACjB,gBAAgB,6BAA6B,QAAQ;AAAA,IACrD,mBAAmB,gCAAgC;AAAA,EACrD,CAAC;AACH;AAEA,SAAS,gCAAgC,SAAS,YAAY,QAAQ;AACpE,SAAO,OAAO;AAAA,IACZ,OAAO;AAAA,MAAI,CAAC,UACV,OAAO,OAAO;AAAA,QACZ,IAAI,MAAM;AAAA,QACV,iBAAiB,MAAM;AAAA,QACvB,QAAQ,OAAO,OAAO;AAAA,UACpB,uBAAuB,MAAM,OAAO;AAAA,UACpC,oBAAoB,MAAM,OAAO;AAAA,UACjC,gBAAgB,MAAM,OAAO;AAAA,UAC7B,gBAAgB,MAAM,OAAO;AAAA,UAC7B,eAAe,MAAM,OAAO;AAAA,UAC5B,UAAU,OAAO,OAAO;AAAA,YACtB,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,SAAS,MAAM;AAAA,UACjB,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAM,6BAA6B;AAAA,EACjC,UAAU;AAAA,IACR,aACE;AAAA,IACF,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,QACP,UAAU;AAAA,QACV,cAAc,CAAC;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,0BAA0B;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,QACV,UAAU;AAAA,QACV,cAAc,CAAC;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,8BAA8B;AAAA,MACzD;AAAA,MACA,YAAY;AAAA,QACV,UAAU;AAAA,QACV,cAAc,CAAC,WAAW,YAAY;AAAA,QACtC,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,0BAA0B;AAAA,MACrD;AAAA,MACA,aAAa;AAAA,QACX,UAAU;AAAA,QACV,cAAc,CAAC,YAAY;AAAA,QAC3B,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,+BAA+B;AAAA,MAC1D;AAAA,MACA,QAAQ;AAAA,QACN,UAAU;AAAA,QACV,cAAc,CAAC,aAAa;AAAA,QAC5B,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,0BAA0B;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,aACE;AAAA,IACF,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,QACP,UAAU;AAAA,QACV,cAAc,CAAC;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,6BAA6B;AAAA,MACxD;AAAA,MACA,YAAY;AAAA,QACV,UAAU;AAAA,QACV,cAAc,CAAC;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,iCAAiC;AAAA,MAC5D;AAAA,MACA,WAAW;AAAA,QACT,UAAU;AAAA,QACV,cAAc,CAAC,SAAS;AAAA,QACxB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,6BAA6B;AAAA,MACxD;AAAA,MACA,YAAY;AAAA,QACV,UAAU;AAAA,QACV,cAAc,CAAC,cAAc,WAAW;AAAA,QACxC,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,6BAA6B;AAAA,MACxD;AAAA,MACA,QAAQ;AAAA,QACN,UAAU;AAAA,QACV,cAAc,CAAC,YAAY;AAAA,QAC3B,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,iBAAiB;AAAA,YACjB,QAAQ;AAAA,cACN,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,6BAA6B;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,SAAS;AAC3C,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,0BAA0B,SAAS;AAC1C,SAAO,OAAO;AAAA,IACZ,mCAAmC;AAAA,MAAI,CAAC,UACtC,OAAO,OAAO;AAAA,QACZ,GAAG;AAAA,QACH;AAAA,QACA,eACE,YAAY,QAAQ,MAAM,QAAQ,sBAC9B,OAAO,OAAO,CAAC,aAAa,YAAY,CAAC,IACzC,MAAM,QAAQ,YACZ,OAAO,OAAO,CAAC,QAAQ,CAAC,IACxB,MAAM,QAAQ,qBACZ,MAAM,QAAQ,kBACd,MAAM,QAAQ,gBACd,OAAO,OAAO,CAAC,aAAa,CAAC,IAC7B,MAAM,QAAQ,sBACZ,OAAO,OAAO,CAAC,YAAY,CAAC,IAC5B,MAAM,QAAQ,kBACZ,MAAM,QAAQ,sBACd,MAAM,QAAQ,sBACd,MAAM,QAAQ,mBACd,MAAM,QAAQ,yBACd,OAAO,OAAO,CAAC,YAAY,CAAC,IAC5B,OAAO,OAAO,CAAC,YAAY,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,iCAAiC,SAAS;AACjD,SAAO,OAAO;AAAA,IACZ,4BAA4B;AAAA,MAAI,CAAC,SAC/B,OAAO,OAAO;AAAA,QACZ,GAAG,mCAAmC,IAAI;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,0CAA0C,SAAS;AAC1D,SAAO,OAAO;AAAA,IACZ,sCAAsC;AAAA,MAAI,CAAC,WACzC,OAAO,OAAO;AAAA,QACZ,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,MAAM,OAAO;AAC7C,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,GAAG,IAAI,8BAA8B;AAAA,EACvD;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,2BAA2B,MAAM,MAAM;AAC9C,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,MAAM,OAAO,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC;AAAA,EAC5C,CAAC;AACH;AAEA,SAAS,+BAA+B,aAAa,SAAS,MAAM;AAClE,QAAM,QAAQ,YAAY,WAAW,IAAI,OAAO;AAChD,SAAO,OAAO,OAAO;AAAA,IACnB,KAAK;AAAA,IACL;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,MACpB,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,cAAc,OAAO;AAAA,QACnB,KAAK,aAAa,IAAI,CAAC,eAAe,YAAY,WAAW,IAAI,UAAU,EAAE;AAAA,MAC/E;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAAA,IACD,aAAa,OAAO,OAAO;AAAA,MACzB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,WAAW;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,IACD,OAAO,OAAO,OAAO;AAAA,MACnB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,OAAO,OAAO,CAAC,YAAY,aAAa,SAAS,KAAK,MAAM,CAAC;AAAA,MACnE,wBAAwB,OAAO,OAAO,CAAC,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,4BAA4B,MAAM,MAAM;AAC/C,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe;AAAA,IACf,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe,2BAA2B,IAAI;AAAA,IAC9C,cAAc,0BAA0B,IAAI;AAAA,IAC5C,qBAAqB,iCAAiC,IAAI;AAAA,IAC1D,8BAA8B,0CAA0C,IAAI;AAAA,IAC5E,wBAAwB,OAAO,OAAO,CAAC,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACtE,MAAM,OAAO;AAAA,MACX,OAAO,QAAQ,KAAK,IAAI,EAAE;AAAA,QAAI,CAAC,CAAC,SAAS,OAAO,MAC9C,+BAA+B,MAAM,SAAS,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,yBAAyB,OAAO;AAAA,EAC3C,OAAO;AAAA,IACL,OAAO,QAAQ,0BAA0B,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MAC/D;AAAA,MACA,2BAA2B,MAAM,IAAI;AAAA,IACvC,CAAC;AAAA,EACH;AACF;AAEO,IAAM,6BAA6B,OAAO;AAAA,EAC/C,OAAO,KAAK,sBAAsB;AACpC;AAEO,IAAM,0BAA0B,OAAO;AAAA,EAC5C,OAAO;AAAA,IACL,OAAO,QAAQ,0BAA0B,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MAC/D;AAAA,MACA,4BAA4B,MAAM,IAAI;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,yBAAyB,OAAO,8BAA8B;AAC5E,QAAM,UAAU,uBAAuB,IAAI;AAC3C,MAAI,CAAC,SAAS;AACZ,UAAM,YAAY,2BAA2B,KAAK,IAAI;AACtD,UAAM,IAAI,MAAM,oCAAoC,IAAI,iBAAiB,SAAS,GAAG;AAAA,EACvF;AACA,SAAO;AACT;AAEO,SAAS,0BAA0B,OAAO,8BAA8B;AAC7E,QAAM,WAAW,wBAAwB,IAAI;AAC7C,MAAI,CAAC,UAAU;AACb,UAAM,YAAY,2BAA2B,KAAK,IAAI;AACtD,UAAM,IAAI,MAAM,oCAAoC,IAAI,iBAAiB,SAAS,GAAG;AAAA,EACvF;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,UAAU,CAAC,GAAG;AACvD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,EACV;AACA,QAAM,iBAAiB,0BAA0B,OAAO;AACxD,QAAM,kBAAkB,MAAM,QAAQ,QAAQ,eAAe,IACzD,OAAO;AAAA,IACL,QAAQ,gBAAgB,IAAI,CAAC,gBAAgB,UAAU;AACrD,UAAI,CAAC,kBAAkB,OAAO,mBAAmB,UAAU;AACzD,cAAM,IAAI,MAAM,mBAAmB,KAAK,sBAAsB;AAAA,MAChE;AACA,YAAM,OAAO;AAAA,QACX,mBAAmB,KAAK;AAAA,QACxB,eAAe;AAAA,MACjB;AACA,UAAI,CAAC,4BAA4B,SAAS,IAAI,GAAG;AAC/C,cAAM,IAAI;AAAA,UACR,mBAAmB,KAAK,0BAA0B,4BAA4B,KAAK,IAAI,CAAC;AAAA,QAC1F;AAAA,MACF;AACA,aAAO,OAAO,OAAO;AAAA,QACnB,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,IACA,eAAe;AAEnB,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe;AAAA,IACf,OAAO;AAAA,IACP;AAAA,IACA,eAAe,OAAO,OAAO;AAAA,MAC3B,GAAG,eAAe;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,IACD,cAAc,eAAe;AAAA,IAC7B,qBAAqB;AAAA,IACrB,8BAA8B,eAAe;AAAA,IAC7C,WAAW,+BAA+B,QAAQ,SAAS;AAAA,IAC3D;AAAA,EACF,CAAC;AACH;AAEA,SAAS,QAAQ,OAAO;AACtB,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEA,SAAS,gBAAgB,SAAS;AAChC,SAAO,SAAS,SAAS,EAAE,IAAI;AACjC;AAEA,SAAS,eAAe,OAAO;AAC7B,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI;AACrC,WAAO,CAAC,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC;AAAA,EAC5G;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,IAAI,QAAQ,CAAC;AACnB,YAAM,IAAI,QAAQ,CAAC;AACnB,aAAO;AAAA,QACL,gBAAgB,IAAI,CAAC;AAAA,QACrB,gBAAgB,IAAI,CAAC;AAAA,QACrB,gBAAgB,IAAI,CAAC;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,aAAO;AAAA,QACL,gBAAgB,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,QACnC,gBAAgB,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,QACnC,gBAAgB,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,mBAAmB;AAChC;AAEA,SAAS,mBAAmB,MAAM,OAAO;AACvC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACtE,UAAM,IAAI,MAAM,GAAG,IAAI,6CAA6C;AAAA,EACtE;AACA,SAAO;AACT;AAEA,SAASD,qBAAoB,MAAM,OAAO;AACxC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,MAAM,GAAG,IAAI,8BAA8B;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAASC,wBAAuB,MAAM,OAAO;AAC3C,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,MAAM,GAAG,IAAI,kCAAkC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,MAAM;AACb,MAAI,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,YAAY;AAC/E,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,SAAO,KAAK,IAAI;AAClB;AAEA,SAAS,iBAAiB,OAAO;AAC/B,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,yBAAyB,SAAS,OAAO;AAChD,QAAM;AAAA,IACJ,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,OAAO,yBAAyB,YAAY;AAC9C,UAAM,WAAW,qBAAqB,KAAK;AAC3C,WAAO,mBAAmB,0BAA0B,QAAQ;AAAA,EAC9D;AAEA,MAAI,2BAA2B,QAAW;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,QAAW;AACjC,WAAO,MAAO;AAAA,EAChB;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,UAAU,CAAC,GAAG;AACrD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,gBAAgB,OAAO,aAAa,gBAAgB,YAAY;AACnE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AAEA,MACE,2BAA2B,UAC3B,yBAAyB,QACzB;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,yBAAyB,UACzB,OAAO,yBAAyB,YAChC;AACA,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,kBAAkB;AAAA,IACtB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,OAAO;AAClB,UAAI,OAAO,iBAAiB,YAAY;AACtC,qBAAa;AAAA,UACX,GAAG;AAAA,UACH,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,gBAAgB,OAAO;AACrB,YAAM,4BAA4B;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAEA,UACE,OAAO,MAAM,gBAAgB,YAC7B,OAAO,SAAS,MAAM,WAAW,KACjC,MAAM,cAAc,GACpB;AACA,qBAAa,YAAY;AAAA,UACvB,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA,UACnB,mBAAmB;AAAA,QACrB,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,oBAAoB,YAAY;AACzC,wBAAgB;AAAA,UACd,GAAG;AAAA,UACH,OAAO;AAAA,UACP,mBAAmB;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,mBAAmB;AACxC,QAAM,mBAAmB,qBAAqB,WAAW;AACzD,MAAI,CAAC,oBAAoB,OAAO,qBAAqB,UAAU;AAC7D,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,kBAAkB;AACtC,QAAM,MAAM,oBAAoB,WAAW;AAC3C,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AACT;AAEA,SAASC,eAAc,kBAAkB,kBAAkB;AACzD,MAAI,oBAAoB,OAAO,qBAAqB,UAAU;AAC5D,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,aAAa,gBAAgB;AACzC,QAAM,WACJ,OAAO,qBAAqB,YAAY,iBAAiB,KAAK,EAAE,SAAS,IACrE,mBACA;AACN,QAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,uCAAuC,QAAQ,IAAI;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,mBAAmB;AAClC,QAAM,mBAAmB,cAAc,iBAAiB;AACxD,QAAM,MAAM,iBAAiB;AAC7B,MAAI,CAAC,OAAO,OAAO,IAAI,mBAAmB,YAAY;AACpD,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAAS,QAAQ,QAAQ,WAAW;AAC5D,MAAI,OAAO,QAAQ,cAAc,YAAY;AAC3C,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,UAAQ,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BAA2B,MAAM,YAAY;AACpD,SAAO;AAAA,IACL,kBAAkB;AAAA,MAChB;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,UACV,GAAG,WAAW,CAAC;AAAA,UACf,GAAG,WAAW,CAAC;AAAA,UACf,GAAG,WAAW,CAAC;AAAA,UACf,GAAG,WAAW,CAAC;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,UAAU,CAAC,GAAG;AAC3C,MAAI;AACF,UAAM,MAAM,QAAQ,QAAQ,SAAS;AACrC,WAAO,QAAQ,GAAG;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBAAkB,UAAU,CAAC,GAAG;AACpD,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,IACb,wBAAwB,WAAW,uBAAuB,KAAK,UAAU;AAAA,IACzE,uBAAuB,WAAW,sBAAsB,KAAK,UAAU;AAAA,IACvE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,MAAM,QAAQ,iBAAiB;AACrC,QAAM,UAAU,MAAM,IAAI,eAAe,EAAE,gBAAgB,CAAC;AAC5D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc;AAC3C,QAAM,eAAeA,eAAc,QAAQ,gBAAgB;AAC3D,QAAM,UAAU,aAAa,aAAa,QAAQ;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,iBACJ,WACC,OAAO,IAAI,6BAA6B,aACrC,IAAI,yBAAyB,IAC7B;AAEN,mBAAiB,SAAS,QAAQ,gBAAgB,QAAQ,kBAAkB,QAAQ;AAEpF,MAAI,UAAU;AACd,MAAI,YAAY;AAChB,MAAI,QAAQ;AACZ,MAAI,gBAAgB;AACpB,MAAI,QAAQ;AACZ,MAAI,QAAQ,eAAe,UAAU;AACrC,MAAI,WAAW;AACf,MAAI,kBAAkB;AAEtB,QAAM,aAAa,CAAC,YAAY,IAAI,MAAM;AACxC,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,UAAM,cAAc,QAAQ;AAC5B,UAAM,UAAU;AAAA,MACd,OAAO,mBAAmB,aACtB,eAAe;AAAA,QACb,OAAO;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC,IACD,kBAAkB,WAAW;AAAA,IACnC;AACA,UAAM,cACJ,gBAAgB,IAAI,KAAK,IAAI,GAAG,YAAY,aAAa,IAAI;AAE/D,QAAI,OAAO,iBAAiB,YAAY;AACtC,mBAAa;AAAA,QACX,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,QAAQ,oBAAoB;AAC5C,QAAI,CAAC,WAAW,OAAO,QAAQ,eAAe,YAAY;AACxD,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,UAAM,UAAU,OAAO,qBAAqB;AAAA,MAC1C,OAAO,8BAA8B,KAAK;AAAA,IAC5C,CAAC;AACD,UAAM,OAAO,QAAQ,WAAW;AAEhC,UAAM,OAAO,QAAQ,gBAAgB,2BAA2B,MAAM,KAAK,CAAC;AAE5E,QAAI,OAAO,mBAAmB,YAAY;AACxC,qBAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,KAAK,QAAQ,YAAY;AAClC,WAAK,IAAI;AAAA,IACX;AAEA,UAAM,gBAAgB,QAAQ,OAAO;AACrC,WAAO,MAAM,OAAO,CAAC,aAAa,CAAC;AAEnC,YAAQ;AACR,oBAAgB;AAEhB,QAAI,OAAO,kBAAkB,YAAY;AACvC,oBAAc;AAAA,QACZ,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,oBAAoB,YAAY;AACzC,sBAAgB;AAAA,QACd,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,cAAc;AAC1B,QAAI,CAAC,WAAW,WAAW;AACzB;AAAA,IACF;AACA,eAAW,SAAS;AACpB,QAAI,OAAO,0BAA0B,YAAY;AAC/C,cAAQ,sBAAsB,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AACA,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,cAAU;AACV,QAAI,OAAO,0BAA0B,YAAY;AAC/C,cAAQ,sBAAsB,IAAI;AAAA,IACpC,OAAO;AACL,iBAAW;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,cAAU;AACV,QAAI,UAAU,QAAQ,OAAO,yBAAyB,YAAY;AAChE,2BAAqB,KAAK;AAAA,IAC5B;AACA,YAAQ;AACR,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,UAAU,WAAW,mBAAmB,WAAW,oBAAoB,MAAM;AAC3F,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,gBAAgB,CAAC;AACjE,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,gBAAgB,CAAC;AACnE,iBAAa,QAAQ;AACrB,iBAAa,SAAS;AACtB,QAAI,aAAa,OAAO;AACtB,mBAAa,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC/D,mBAAa,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,IACnE;AACA,WAAO,EAAE,OAAO,OAAO;AAAA,EACzB;AAEA,QAAM,gBAAgB,CAAC,UAAU;AAC/B,YAAQ,eAAe,KAAK;AAC5B,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AAEA,QAAM,cAAc,CAAC,WAAW;AAC9B,eAAW,QAAQ,MAAM;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,QAAQ,OAAO,aAAa,KAAK,KAAK;AAC5C,UAAM,SAAS,OAAO,aAAa,MAAM,KAAK;AAC9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,WAAW,cAAc,CAAC,GAAG;AACzC,UAAI,iBAAiB;AACnB,wBAAgB;AAAA,MAClB;AACA,wBAAkB,wBAAwB,UAAU,WAAW,WAAW;AAC1E,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AACR,WAAK;AACL,kBAAY;AACZ,UAAI,iBAAiB;AACnB,wBAAgB;AAChB,0BAAkB;AAAA,MACpB;AACA,UAAI,OAAO,QAAQ,gBAAgB,YAAY;AAC7C,gBAAQ,YAAY;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,WAAW;AACxC,MAAI,aAAa,OAAO,UAAU,aAAa,YAAY;AACzD,WAAO,UAAU,SAAS;AAAA,EAC5B;AACA,MAAI,WAAW,SAAS,OAAO,UAAU,MAAM,gBAAgB,YAAY;AACzE,WAAO,UAAU,MAAM,YAAY;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,UAAU,WAAW,UAAU,CAAC,GAAG;AACzE,MAAI,CAAC,aAAa,OAAO,UAAU,cAAc,YAAY;AAC3D,UAAM,IAAI,MAAM,oFAAoF;AAAA,EACtG;AAEA,QAAM,EAAE,gBAAgB,aAAa,IAAI;AACzC,MAAI,kBAAkB;AAEtB,QAAM,aAAa,CAAC,UAAU;AAC5B,UAAM,UAAU,OAAO,iBAAiB;AACxC,QAAI,YAAY,iBAAiB;AAC/B;AAAA,IACF;AAEA,sBAAkB;AAElB,QAAI,OAAO,SAAS,gBAAgB,YAAY;AAC9C,eAAS,YAAY,QAAQ,OAAO,CAAC;AAAA,IACvC;AAEA,QAAI,WAAW,OAAO,mBAAmB,YAAY;AACnD,qBAAe,SAAS,QAAQ;AAAA,IAClC;AAEA,QAAI,CAAC,WAAW,OAAO,iBAAiB,YAAY;AAClD,mBAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,aAAW,sBAAsB,SAAS,CAAC;AAC3C,SAAO,UAAU,UAAU,UAAU;AACvC;AAEO,IAAM,4BAA4B;","names":["scale","tangent","bitangent","options","readPositiveInteger","readNonNegativeInteger","resolveCanvas"]}
1
+ {"version":3,"sources":["../src/wavefront-frame-runtime.js","../src/wavefront-compute.js","../src/index.js"],"sourcesContent":["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 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","import {\n createGpuParallelismCounters,\n createGpuParallelismDiagnostics,\n createGpuSubmissionBatcher,\n createGpuWorkerJobDiagnostics,\n recordDirectDispatch,\n recordIndirectDispatch,\n} from \"./wavefront-frame-runtime.js\"\n\nconst DEFAULT_WIDTH = 1280;\nconst DEFAULT_HEIGHT = 720;\nconst DEFAULT_MAX_DEPTH = 6;\nconst DEFAULT_TILE_SIZE = 128;\nconst DEFAULT_SAMPLES_PER_PIXEL = 1;\nconst MAX_SAMPLES_PER_PIXEL = 256;\nconst DEFAULT_BRDF_LUT_SIZE = 128;\nconst DEFAULT_BRDF_LUT_SAMPLE_COUNT = 256;\nconst DEFAULT_MAX_FRAME_PASSES_PER_SUBMISSION = 256;\nconst DEFAULT_SCENE_OBJECT_CAPACITY = 128;\nconst DEFAULT_ENVIRONMENT_PORTAL_CAPACITY = 32;\nconst DEFAULT_MEDIUM_PHASE_MODEL = 0;\nconst WORKGROUP_SIZE = 64;\nexport const rendererWavefrontComputeMode = \"webgpu-compute\";\nexport const rendererWavefrontComputeWorkgroupSize = WORKGROUP_SIZE;\nexport const rendererWavefrontComputeStatsStride = 8;\nconst RAY_RECORD_BYTES = 80;\nconst HIT_RECORD_BYTES = 256;\nconst SCENE_OBJECT_RECORD_BYTES = 160;\nconst MESH_VERTEX_RECORD_BYTES = 48;\nconst MESH_RANGE_RECORD_BYTES = 240;\nconst TRIANGLE_RECORD_BYTES = 352;\nconst GPU_MATERIAL_RECORD_BYTES = 192;\nconst BVH_NODE_RECORD_BYTES = 48;\nconst BVH_LEAF_REF_RECORD_BYTES = 16;\nconst EMISSIVE_TRIANGLE_INDEX_BYTES = 4;\nconst ENVIRONMENT_PORTAL_RECORD_BYTES = 96;\nconst MEDIUM_TABLE_ROWS = 2;\nconst ACCUMULATION_RECORD_BYTES = 16;\nconst PATH_VERTEX_RECORD_BYTES = 16;\nconst GPU_SUBMITTED_WORK_TIMEOUT_MS = 5_000;\nconst GPU_READBACK_COMPLETION_TIMEOUT_MS = 60_000;\nconst GPU_MAX_SUBMITTED_WORK_TIMEOUT_MS = 60_000;\nconst GPU_MAX_SUBMITTED_WORK_DEADLINE_MS = 180_000;\nconst CONFIG_BUFFER_BYTES = 320;\nconst COUNTER_DISPATCH_ARGS_OFFSET = 16;\nconst INDIRECT_DISPATCH_ARGS_BYTES = 12;\nconst COUNTER_BUFFER_BYTES = 32;\nconst TRACE_STORAGE_BUFFER_BINDINGS = 10;\nconst BRDF_LUT_UPLOAD_CACHE = new Map();\nconst HIT_TYPE_SURFACE = 0;\nconst HIT_TYPE_EMISSIVE = 1;\nconst MATERIAL_DIFFUSE = 0;\nconst MATERIAL_METAL = 1;\nconst MATERIAL_DIELECTRIC = 2;\nconst MATERIAL_TRANSPARENT = 3;\nconst MATERIAL_EMISSIVE = 4;\nconst OBJECT_KIND_SPHERE = 1;\nconst OBJECT_KIND_BOX = 2;\n\nconst 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\nconst DEFAULT_ENVIRONMENT_COLOR = Object.freeze([0.35, 0.43, 0.49, 1]);\nconst DEFAULT_AMBIENT_COLOR = Object.freeze([0.018, 0.022, 0.026, 1]);\nconst 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 wavefrontPathTracingComputeLimits = Object.freeze({\n workgroupSize: WORKGROUP_SIZE,\n traceStorageBufferBindings: TRACE_STORAGE_BUFFER_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\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\nfunction 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\nfunction 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\nfunction 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\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction 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\nfunction 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\nfunction maxComponent(value) {\n return Math.max(value?.[0] ?? 0, value?.[1] ?? 0, value?.[2] ?? 0);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction resolveDeferredPathResolve(options = {}) {\n const value =\n options.deferredPathResolve ??\n options.deferredResolve ??\n options.pathResolve?.deferred ??\n true;\n return value !== false;\n}\n\nfunction emissionPower(emission) {\n return Math.max(0, emission?.[0] ?? 0) + Math.max(0, emission?.[1] ?? 0) + Math.max(0, emission?.[2] ?? 0);\n}\n\nfunction asUnitVec3(value, fallback) {\n const vector = asVec3(value, fallback);\n return normalize(vector, fallback);\n}\n\nfunction add(a, b) {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\nfunction subtract(a, b) {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction scale(a, scalar) {\n return [a[0] * scalar, a[1] * scalar, a[2] * scalar];\n}\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction random01FromSeed(seed) {\n return (hashUint32(seed) & 0x00ffffff) / 16777215;\n}\n\nfunction getArrayLikeLength(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value) ? value.length : 0;\n}\n\nfunction 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\nfunction readVector2(values, index, fallback = [0, 0]) {\n return readVector(values, index, 2, fallback);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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 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\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 return input?.volume ?? input?.material?.volume ?? null;\n}\n\nfunction 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\nfunction 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\nfunction 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\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 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, 0),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.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, 1.45), 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, 0), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n 0.08\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, 1), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: normalizeWavefrontThickness(input, \"thickness\"),\n transmission,\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 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, 0),\n 0,\n 1\n );\n const sheenColor = resolveSheenColor(input, color);\n const specularColor = asColor(\n input.specularColor ?? input.material?.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, 1.45), 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, 0), 0, 1),\n clearcoatRoughness: clamp(\n readFiniteNumber(\n \"clearcoatRoughness\",\n input.clearcoatRoughness ?? input.material?.clearcoatRoughness,\n 0.08\n ),\n 0,\n 1\n ),\n specular: clamp(readFiniteNumber(\"specular\", input.specular ?? input.material?.specular, 1), 0, 1),\n specularColor: Object.freeze(specularColor),\n thickness: normalizeWavefrontThickness(input, \"mesh thickness\"),\n transmission,\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 });\n}\n\nfunction clampUnit(value) {\n return clamp(Number(value) || 0, 0, 1);\n}\n\nfunction srgbToLinear(value) {\n const channel = clampUnit(value);\n if (channel <= 0.04045) {\n return channel / 12.92;\n }\n return ((channel + 0.055) / 1.055) ** 2.4;\n}\n\nfunction sampleTextureRgba(texture, uv = [0, 0], colorSpace = \"linear\") {\n if (\n !texture ||\n !Number.isFinite(texture.width) ||\n !Number.isFinite(texture.height) ||\n !texture.data ||\n texture.width <= 0 ||\n texture.height <= 0\n ) {\n return [1, 1, 1, 1];\n }\n const u = ((uv[0] % 1) + 1) % 1;\n const v = ((uv[1] % 1) + 1) % 1;\n const x = Math.min(texture.width - 1, Math.max(0, Math.round(u * (texture.width - 1))));\n const y = Math.min(texture.height - 1, Math.max(0, Math.round((1 - v) * (texture.height - 1))));\n const offset = (y * texture.width + x) * 4;\n const data = texture.data;\n const scale = resolveTextureSampleScale(data);\n const defaultChannel = scale === 1 ? 1 : Math.round(1 / scale);\n const color = [\n (data[offset] ?? defaultChannel) * scale,\n (data[offset + 1] ?? defaultChannel) * scale,\n (data[offset + 2] ?? defaultChannel) * scale,\n (data[offset + 3] ?? defaultChannel) * scale,\n ];\n if (colorSpace === \"srgb\") {\n return [srgbToLinear(color[0]), srgbToLinear(color[1]), srgbToLinear(color[2]), color[3]];\n }\n return color;\n}\n\nfunction resolveTextureSampleScale(data) {\n if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) {\n return 1 / 255;\n }\n if (data instanceof Uint16Array) {\n return 1 / 65535;\n }\n if (Array.isArray(data) && data.some((value) => Number(value) > 1)) {\n return 1 / 255;\n }\n return 1;\n}\n\nfunction normalizeVectorOrFallback(vector, fallback) {\n return normalize(Array.isArray(vector) ? vector : fallback, fallback);\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 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 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\nfunction 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\nfunction 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 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 });\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction normalizeWavefrontMeshes(meshes) {\n const source = Array.isArray(meshes) ? meshes : [];\n return source.map((mesh, index) => normalizeWavefrontMesh(mesh, index));\n}\n\nfunction 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\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 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 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\nfunction 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 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 16\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 const materialCapacity = readNonNegativeInteger(\"materialCapacity\", options.materialCapacity, 0);\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 = triangleCapacity * TRIANGLE_RECORD_BYTES;\n const materialTableBytes = materialCapacity * GPU_MATERIAL_RECORD_BYTES;\n const bvhNodeBytes = bvhNodeCapacity * BVH_NODE_RECORD_BYTES;\n const bvhLeafReferenceBytes = bvhLeafSortCapacity * BVH_LEAF_REF_RECORD_BYTES;\n const emissiveTriangleMetadataBytes =\n emissiveTriangleCapacity * BVH_NODE_RECORD_BYTES;\n const environmentPortalBytes =\n environmentPortalCapacity * ENVIRONMENT_PORTAL_RECORD_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 bvhLeafReferenceBytes,\n emissiveTriangleMetadataBytes,\n environmentPortalBytes,\n configBytes: CONFIG_BUFFER_BYTES,\n counterBytes: COUNTER_BUFFER_BYTES,\n indirectDispatchBytes: INDIRECT_DISPATCH_ARGS_BYTES,\n totalHotBufferBytes:\n queueBytes * 2 +\n hitBytes +\n accumulationBytes +\n pathVertexBytes +\n sceneObjectBytes +\n triangleBytes +\n materialTableBytes +\n bvhNodeBytes +\n bvhLeafReferenceBytes +\n emissiveTriangleMetadataBytes +\n environmentPortalBytes +\n CONFIG_BUFFER_BYTES +\n COUNTER_BUFFER_BYTES +\n INDIRECT_DISPATCH_ARGS_BYTES,\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(readPositiveInteger(\"maxDepth\", options.maxDepth, DEFAULT_MAX_DEPTH), 1, 16);\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\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 displayQuality: options.displayQuality === true,\n requiresMeshBvhForDisplayQuality: true,\n denoise: options.denoise !== false,\n frameIndex: readNonNegativeInteger(\"frameIndex\", options.frameIndex, 0),\n memory: estimateWavefrontPathTracingMemory({\n tilePixelCapacity,\n maxDepth,\n sceneObjectCapacity,\n triangleCapacity,\n materialCapacity: gpuMaterialSource.count,\n bvhNodeCapacity,\n bvhLeafSortCapacity,\n emissiveTriangleCapacity: emissiveTriangleIndices.capacity,\n environmentPortalCapacity,\n }),\n });\n}\n\nexport function supportsWavefrontPathTracingCompute(options = {}) {\n const navigatorRef = options.navigator ?? globalThis.navigator;\n return typeof navigatorRef?.gpu?.requestAdapter === \"function\";\n}\n\nfunction 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\nfunction 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\nfunction writeVec4(floatView, byteOffset, value) {\n const index = byteOffset / 4;\n floatView[index] = value[0] ?? 0;\n floatView[index + 1] = value[1] ?? 0;\n floatView[index + 2] = value[2] ?? 0;\n floatView[index + 3] = value[3] ?? 0;\n}\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 });\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\nfunction 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, 0, true);\n data.setUint32(268, 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 0,\n 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\nfunction 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\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 = random01FromSeed(mixSeed(sourcePixelId, sampleIndex, 0, frameIndex, 1)) - 0.5;\n const jitterY = random01FromSeed(mixSeed(sourcePixelId, sampleIndex, 0, frameIndex, 2)) - 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 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 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 maxPixels = Math.max(256, Math.min(maxPixelsByRay, maxPixelsByHit));\n if (config.tilePixelCapacity <= maxPixels) {\n return config.tileSize;\n }\n\n return Math.max(16, Math.floor(Math.sqrt(maxPixels)));\n}\n\nfunction createBuffer(device, usage, size, label) {\n return device.createBuffer({\n label,\n size: Math.max(4, size),\n usage,\n });\n}\n\nfunction 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 reflectVector(direction, normal) {\n return subtract(direction, scale(normal, 2 * dot(direction, normal)));\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction hammersley(index, count) {\n return [index / Math.max(count, 1), radicalInverseVdc(index)];\n}\n\nfunction 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\nfunction 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\nfunction geometrySchlickGgx(nDotV, roughness) {\n const k = ((roughness + 1) * (roughness + 1)) / 8;\n return nDotV / Math.max(nDotV * (1 - k) + k, 0.000001);\n}\n\nfunction geometrySmith(nDotV, nDotL, roughness) {\n return geometrySchlickGgx(nDotV, roughness) * geometrySchlickGgx(nDotL, roughness);\n}\n\nfunction 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\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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nasync function getPipelineDiagnostics(shaderModule) {\n if (typeof shaderModule?.compilationInfo !== \"function\") {\n return \"\";\n }\n try {\n const info = await shaderModule.compilationInfo();\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\nasync 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\nasync function assertShaderModuleCompiles(shaderModule, label) {\n if (typeof shaderModule?.compilationInfo !== \"function\") {\n return;\n }\n const info = await shaderModule.compilationInfo();\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\nasync function createRenderPipeline(device, descriptor) {\n if (typeof device.createRenderPipelineAsync === \"function\") {\n return device.createRenderPipelineAsync(descriptor);\n }\n return device.createRenderPipeline(descriptor);\n}\n\nconst WAVEFRONT_COMPUTE_WGSL = `\nconst RAY_FLAG_GUIDED_EMISSIVE: u32 = 1u;\nconst RAY_FLAG_DELTA_SAMPLE: u32 = 2u;\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 pad0: u32,\n origin: vec4<f32>,\n direction: vec4<f32>,\n throughput: vec4<f32>,\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};\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 pad0: 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 _portalPad0: u32,\n _portalPad1: u32,\n environmentMapSettings: vec4<f32>,\n pathResolveSettings: vec4<f32>,\n environmentMapMeta: vec4<f32>,\n};\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};\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\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 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\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 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 triangle.materialResponse,\n triangle.materialExtension,\n triangle.specularColor,\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 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 record_deferred_path_response(ray: RayRecord, response: 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>(max(response, vec3<f32>(0.0)), 1.0);\n}\n\nfn record_deferred_terminal_source(ray: RayRecord, sourceRadiance: vec3<f32>) {\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>(clamp_sample_radiance(sourceRadiance), 1.0);\n}\n\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_environment_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 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 let gradient =\n config.environmentHorizonColor.xyz * (1.0 - upFactor) +\n config.environmentZenithColor.xyz * upFactor;\n return (\n gradient +\n config.environmentSunColor.xyz * sunGlow\n ) * max(config.environmentSunDirectionIntensity.w, 0.0001);\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 radical_inverse_vdc(bitsValue: u32) -> f32 {\n var bits = bitsValue;\n bits = (bits << 16u) | (bits >> 16u);\n bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xaaaaaaaau) >> 1u);\n bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xccccccccu) >> 2u);\n bits = ((bits & 0x0f0f0f0fu) << 4u) | ((bits & 0xf0f0f0f0u) >> 4u);\n bits = ((bits & 0x00ff00ffu) << 8u) | ((bits & 0xff00ff00u) >> 8u);\n return f32(bits) * 2.3283064365386963e-10;\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 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 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\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 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\nfn transmitted_medium_ref_id(ray: RayRecord, hit: HitRecord) -> u32 {\n if (hit.mediumRefId == 0u) {\n return ray.mediumRefId;\n }\n if (hit.frontFace == 1u) {\n return hit.mediumRefId;\n }\n if (ray.mediumRefId == hit.mediumRefId) {\n return 0u;\n }\n return ray.mediumRefId;\n}\n\nfn surface_path_response(hit: HitRecord) -> vec3<f32> {\n let color = clamp(hit.color.xyz, vec3<f32>(0.0), vec3<f32>(1.0));\n let opacity = clamp(hit.material.z, 0.0, 1.0);\n let occlusion = clamp(hit.occlusion, 0.0, 1.0);\n let materialEnergy = select(0.68, 0.92, hit.materialKind == 1u || hit.materialKind == 2u);\n let transparentEnergy = select(materialEnergy, 0.9, hit.hitType == 3u);\n return mix(vec3<f32>(1.0), color, max(opacity, 0.18)) * transparentEnergy * mix(0.55, 1.0, occlusion);\n}\n\nfn bounded_path_response_luminance(ray: RayRecord, hit: HitRecord) -> f32 {\n let daylightFloor = max(config.pathResolveSettings.y, 0.0) * 0.08;\n let hdriFloor = max(config.environmentMapSettings.w, 0.0) * 0.02;\n let sceneFloor = max(daylightFloor, hdriFloor);\n if (sceneFloor <= 0.000001) {\n return 0.0;\n }\n let bounceRatio = select(\n 0.0,\n f32(ray.bounce) / max(f32(config.maxDepth - 1u), 1.0),\n config.maxDepth > 1u\n );\n let bounceScale = 1.0 - bounceRatio * 0.55;\n let materialScale = select(1.0, 0.34, hit.materialKind == 1u || hit.materialKind == 2u);\n let transparentScale = select(materialScale, 0.58, hit.hitType == 3u);\n let opacityScale = mix(0.55, 1.0, clamp(hit.material.z, 0.0, 1.0));\n return sceneFloor * bounceScale * transparentScale * opacityScale;\n}\n\nfn stabilize_surface_path_response(ray: RayRecord, hit: HitRecord, response: vec3<f32>) -> vec3<f32> {\n let minimumLuminance = bounded_path_response_luminance(ray, hit);\n let responseLuminance = radiance_luminance(response);\n if (minimumLuminance <= 0.000001 || responseLuminance >= minimumLuminance) {\n return response;\n }\n let tintBase = max(response, max(hit.color.xyz * 0.65, config.ambientColor.xyz * 0.35));\n let tint = tintBase / max(max_component(tintBase), 0.0001);\n let lifted = select(\n tint * minimumLuminance,\n response * (minimumLuminance / max(responseLuminance, 0.0001)),\n responseLuminance > 0.0001\n );\n return clamp(lifted, vec3<f32>(0.0), vec3<f32>(0.98));\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 clamp_sample_radiance(sunTint * baseline * skyFacing * directionalWeight * 0.04);\n}\n\nfn terminal_surface_environment_source(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let origin = hit.position.xyz + normal * 0.003;\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 clamp_sample_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 clamp_sample_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 );\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 surface_direct_environment_contribution(ray: RayRecord, hit: HitRecord) -> vec3<f32> {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\n let origin = hit.position.xyz + normal * 0.003;\n let viewDirection = safe_normalize(-ray.direction.xyz, normal);\n let lightSample = sample_environment_importance(vec2<f32>(\n random01(mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 41u)),\n random01(mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 43u))\n ));\n if (lightSample.pdf <= 0.000001) {\n return vec3<f32>(0.0);\n }\n let lightDirection = safe_normalize(lightSample.direction, normal);\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, 1000000.0)) {\n return vec3<f32>(0.0);\n }\n let incidentRadiance = direct_environment_radiance(origin, lightDirection);\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 =\n ray.throughput.xyz *\n bsdf *\n incidentRadiance *\n (nDotL * misWeight / max(lightSample.pdf, 0.000001));\n return clamp_sample_radiance(contribution);\n}\n\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 triangles[triangleIndex] = TriangleRecord(\n triangleIndex,\n mesh.meshId,\n mesh.materialKind,\n mesh.flags,\n mesh.materialRefId,\n mesh.mediumRefId,\n mesh.materialSlot,\n 0u,\n vec4<f32>(vertex0.position.xyz, 0.0),\n vec4<f32>(vertex1.position.xyz, 0.0),\n vec4<f32>(vertex2.position.xyz, 0.0),\n vec4<f32>(n0, 0.0),\n vec4<f32>(n1, 0.0),\n vec4<f32>(n2, 0.0),\n vec4<f32>(uv0, uv1),\n vec4<f32>(uv2, 0.0, 0.0),\n mesh.color,\n mesh.emission,\n mesh.material,\n mesh.materialResponse,\n mesh.materialExtension,\n mesh.specularColor,\n mesh.baseColorAtlas,\n mesh.metallicRoughnessAtlas,\n mesh.normalAtlas,\n mesh.occlusionAtlas,\n mesh.emissiveAtlas,\n mesh.textureSettings\n );\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 jitterX = random01(mix_seed(sourcePixelId, sampleId, 0u, config.frameIndex, 1u)) - 0.5;\n let jitterY = random01(mix_seed(sourcePixelId, sampleId, 0u, config.frameIndex, 2u)) - 0.5;\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 );\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\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 clamp_sample_radiance(value: vec3<f32>) -> vec3<f32> {\n return min(max(value, vec3<f32>(0.0)), vec3<f32>(4.0));\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 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 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 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, 1.0, 0.0, 0.0),\n vec4<f32>(0.0, 1.0, 0.0, 0.0),\n vec4<f32>(0.0, 1.0, 0.0, 0.0),\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 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 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 offset_origin(position: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n return position + normal * 0.0025;\n}\n\nfn random_unit_vector(seed: u32) -> vec3<f32> {\n let z = random01(seed) * 2.0 - 1.0;\n let a = random01(seed + 11u) * 6.28318530718;\n let r = sqrt(max(0.0, 1.0 - z * z));\n return vec3<f32>(r * cos(a), r * sin(a), z);\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 sample_emissive_triangle_direction(hit: HitRecord, seed: u32, fallback: vec3<f32>) -> vec3<f32> {\n if (config.emissiveTriangleCount == 0u) {\n return fallback;\n }\n let lightSlot = min(u32(random01(seed + 71u) * f32(config.emissiveTriangleCount)), config.emissiveTriangleCount - 1u);\n let lightMetadata = bvhNodes[config.bvhNodeCapacity + lightSlot];\n let triangleIndex = lightMetadata.childOrFirst;\n if (triangleIndex >= config.triangleCount) {\n return fallback;\n }\n\n let lightTriangle = triangles[triangleIndex];\n let r1 = random01(seed + 101u);\n let r2 = random01(seed + 193u);\n let root = sqrt(r1);\n let b0 = 1.0 - root;\n let b1 = root * (1.0 - r2);\n let b2 = root * r2;\n let lightPoint =\n lightTriangle.v0.xyz * b0 +\n lightTriangle.v1.xyz * b1 +\n lightTriangle.v2.xyz * b2;\n return safe_normalize(lightPoint - hit.position.xyz, fallback);\n}\n\nfn sample_environment_portal_direction(hit: HitRecord, seed: u32, fallback: vec3<f32>) -> vec3<f32> {\n if (config.environmentPortalCount == 0u || config.environmentPortalMode == 0u) {\n return fallback;\n }\n let portalSlot = min(\n u32(random01(seed + 211u) * f32(config.environmentPortalCount)),\n config.environmentPortalCount - 1u\n );\n let portal = environmentPortals[portalSlot];\n let u = (random01(seed + 223u) * 2.0 - 1.0) * portal.tangent.w;\n let v = (random01(seed + 227u) * 2.0 - 1.0) * 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, seed: u32) -> ScatterResult {\n let normal = safe_normalize(hit.shadingNormal.xyz, vec3<f32>(0.0, 1.0, 0.0));\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 0u,\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 if (cannotRefract || random01(seed + 23u) < 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 0u,\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 0u,\n );\n }\n\n let guidedEmissiveAvailable = config.emissiveTriangleCount > 0u;\n let guidedPortalAvailable =\n config.environmentPortalCount > 0u && config.environmentPortalMode != 0u;\n let guidedSelector = random01(seed + 17u);\n if (guidedEmissiveAvailable && guidedSelector < 0.18) {\n let guidedDirection = sample_emissive_triangle_direction(hit, seed + 101u, normal);\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 0u,\n );\n }\n }\n if (guidedPortalAvailable && guidedSelector < 0.32) {\n let guidedDirection = sample_environment_portal_direction(hit, seed + 131u, normal);\n if (dot(normal, guidedDirection) > 0.000001) {\n let guidedPdf = max(evaluate_surface_bsdf_pdf(hit, viewDirection, guidedDirection), 0.000001);\n return ScatterResult(vec4<f32>(guidedDirection, 0.0), guidedPdf, ray.mediumRefId, 0u, 0u);\n }\n }\n\n let weights = surface_bsdf_sampling_weights(hit);\n let selector = random01(seed + 31u);\n var lightDirection = normal;\n if (selector < weights.x) {\n lightDirection = cosine_sample_hemisphere(\n vec2<f32>(random01(seed + 37u), random01(seed + 41u)),\n normal\n );\n } else if (selector < weights.x + weights.y) {\n let halfVector = importance_sample_ggx(\n vec2<f32>(random01(seed + 47u), random01(seed + 53u)),\n max(roughness, 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n } else {\n let halfVector = importance_sample_ggx(\n vec2<f32>(random01(seed + 59u), random01(seed + 61u)),\n max(clamp(hit.materialExtension.x, 0.0, 1.0), 0.02),\n normal\n );\n lightDirection = safe_normalize(reflect(-viewDirection, halfVector), normal);\n }\n if (dot(normal, lightDirection) <= 0.000001) {\n lightDirection = cosine_sample_hemisphere(\n vec2<f32>(random01(seed + 67u), random01(seed + 71u)),\n normal\n );\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, 0u);\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(ray.mediumRefId, 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 let sourceRadiance = max(hit.emission.xyz, hit.color.xyz) * guidedLightWeight;\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, sourceRadiance * segmentTransmittance);\n } else {\n contribution = clamp_sample_radiance(arrivingThroughput * sourceRadiance);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(contribution * sample_weight(), 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(ray, sourceRadiance * segmentTransmittance);\n } else {\n contribution = clamp_sample_radiance(arrivingThroughput * sourceRadiance);\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(contribution * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let response = stabilize_surface_path_response(\n ray,\n hit,\n surface_path_response(hit) * segmentTransmittance\n );\n record_deferred_path_response(ray, response);\n\n let shouldEstimateDirectEnvironment =\n (hit.materialKind == 0u || hit.materialKind == 1u) &&\n hit.material.z >= 0.95 &&\n ray.bounce < 2u;\n if (shouldEstimateDirectEnvironment) {\n let directEnvironment = surface_direct_environment_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 0u,\n ray.origin,\n ray.direction,\n vec4<f32>(arrivingThroughput, ray.throughput.w)\n ),\n hit\n );\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(directEnvironment * sample_weight(), 0.0);\n }\n\n if (ray.bounce + 1u >= config.maxDepth) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, terminal_surface_environment_source(ray, hit));\n } else {\n let terminalEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(terminalEnvironment * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n\n let seed = mix_seed(ray.sourcePixelId, ray.sampleId, ray.bounce, config.frameIndex, 11u);\n let scatter = scatter_direction(ray, hit, seed);\n let nextIndex = atomicAdd(&counters.nextCount, 1u);\n if (nextIndex >= config.tilePixelCount) {\n if (deferred_path_resolve_enabled()) {\n record_deferred_terminal_source(ray, terminal_surface_environment_source(ray, hit));\n } else {\n let overflowEnvironment = terminal_surface_environment_contribution(\n ray,\n arrivingThroughput,\n hit\n );\n accumulation[ray.rayId] =\n accumulation[ray.rayId] + vec4<f32>(overflowEnvironment * sample_weight(), 1.0);\n }\n atomicAdd(&counters.terminatedCount, 1u);\n return;\n }\n let throughput = ray.throughput.xyz * response;\n nextQueue[nextIndex] = RayRecord(\n ray.rayId,\n ray.rayId,\n ray.sourcePixelId,\n ray.sampleId,\n ray.bounce + 1u,\n scatter.mediumRefId,\n scatter.flags,\n 0u,\n vec4<f32>(offset_origin(hit.position.xyz, hit.shadingNormal.xyz), 1.0),\n scatter.direction,\n vec4<f32>(throughput, scatter.pdf)\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 response = pathVertices[path_vertex_index(rayId, depth)];\n if (response.w > 0.0) {\n radiance = radiance * response.xyz;\n }\n }\n return clamp_sample_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 resolved = resolve_deferred_path_radiance(index) * sample_weight();\n radiance = clamp_sample_radiance(radiance + resolved);\n accumulation[index] = vec4<f32>(radiance, 1.0);\n }\n\n textureStore(radianceImage, pixel, vec4<f32>(radiance, 1.0));\n if (config.denoise == 0u) {\n textureStore(outputImage, pixel, vec4<f32>(tone_map_radiance(radiance), 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>(tone_map_radiance(radiance), 1.0));\n}\n`;\n\nconst 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\nfunction createWavefrontDeviceDescriptor(adapter, options = {}) {\n const requiredLimits = { ...(options.requiredLimits ?? {}) };\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 descriptor = { ...(options.deviceDescriptor ?? {}) };\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\nfunction 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 }),\n configuredWorkgroupSize: WORKGROUP_SIZE,\n });\n}\n\nfunction 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\nfunction 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\nfunction 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\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(createWavefrontDeviceDescriptor(adapter, options));\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 });\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 rayQueueBytes = config.tilePixelCapacity * RAY_RECORD_BYTES;\n const hitBytes = config.tilePixelCapacity * HIT_RECORD_BYTES;\n const accumulationBytes = config.tilePixelCapacity * ACCUMULATION_RECORD_BYTES;\n const pathVertexBytes = config.tilePixelCapacity * (config.maxDepth + 1) * PATH_VERTEX_RECORD_BYTES;\n const activeQueue = createBuffer(device, bufferUsage, rayQueueBytes, \"plasius.wavefront.activeQueue\");\n const nextQueue = createBuffer(device, bufferUsage, rayQueueBytes, \"plasius.wavefront.nextQueue\");\n const hitBuffer = createBuffer(device, bufferUsage, hitBytes, \"plasius.wavefront.hitBuffer\");\n const accumulationBuffer = createBuffer(\n device,\n bufferUsage,\n accumulationBytes,\n \"plasius.wavefront.accumulation\"\n );\n const pathVertexBuffer = createBuffer(\n device,\n bufferUsage,\n pathVertexBytes,\n \"plasius.wavefront.pathVertices\"\n );\n const sceneObjectBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n config.sceneObjectCapacity * SCENE_OBJECT_RECORD_BYTES,\n \"plasius.wavefront.sceneObjects\"\n );\n const triangleBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.triangleCapacity) * TRIANGLE_RECORD_BYTES,\n \"plasius.wavefront.triangles\"\n );\n const bvhNodeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.bvhNodeCapacity + config.emissiveTriangleCapacity) *\n BVH_NODE_RECORD_BYTES,\n \"plasius.wavefront.bvhNodes\"\n );\n const meshVertexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.vertices.count) * MESH_VERTEX_RECORD_BYTES,\n \"plasius.wavefront.meshVertices\"\n );\n const meshIndexBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.indices.count) * 4,\n \"plasius.wavefront.meshIndices\"\n );\n const meshRangeBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.gpuMeshSource.meshes.count) * MESH_RANGE_RECORD_BYTES,\n \"plasius.wavefront.meshRanges\"\n );\n const environmentPortalBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.environmentPortalCapacity) * ENVIRONMENT_PORTAL_RECORD_BYTES,\n \"plasius.wavefront.environmentPortals\"\n );\n const bvhLeafRefBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST,\n Math.max(1, config.bvhLeafSortCapacity) * BVH_LEAF_REF_RECORD_BYTES,\n \"plasius.wavefront.bvhLeafRefs\"\n );\n const tiles = createTiles(config.width, config.height, config.tileSize);\n const uniformOffsetAlignment = Number(device?.limits?.minUniformBufferOffsetAlignment);\n const configBufferStride = alignTo(\n CONFIG_BUFFER_BYTES,\n Number.isFinite(uniformOffsetAlignment) && uniformOffsetAlignment > 0\n ? uniformOffsetAlignment\n : CONFIG_BUFFER_BYTES\n );\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 frameConfigSlotCount * configBufferStride,\n \"plasius.wavefront.frameConfig\"\n );\n const bvhBuildConfigSlots =\n 1 + config.bvhSortStages.length + config.bvhBuildLevels.length;\n const bvhBuildConfigBuffer = createBuffer(\n device,\n constants.buffer.UNIFORM | constants.buffer.COPY_DST,\n Math.max(1, bvhBuildConfigSlots) * configBufferStride,\n \"plasius.wavefront.bvhBuildConfig\"\n );\n const counterBuffer = createBuffer(\n device,\n constants.buffer.STORAGE | constants.buffer.COPY_DST | constants.buffer.COPY_SRC,\n COUNTER_BUFFER_BYTES,\n \"plasius.wavefront.counters\"\n );\n const activeDispatchBuffer = createBuffer(\n device,\n constants.buffer.INDIRECT | constants.buffer.COPY_DST,\n INDIRECT_DISPATCH_ARGS_BYTES,\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 config.emissiveTriangleIndices.indices.forEach((triangleIndex, index) => {\n const nodeOffset = (config.bvhNodeCapacity + index) * (BVH_NODE_RECORD_BYTES / 4);\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 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 traceBindGroupLayout = 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 ],\n });\n const accelerationBindGroupLayout = 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 denoiseRadianceBindGroupLayout = 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 denoiseResolveBindGroupLayout = 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 tracePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.tracePipelineLayout\",\n bindGroupLayouts: [traceBindGroupLayout],\n });\n const accelerationPipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.accelerationPipelineLayout\",\n bindGroupLayouts: [accelerationBindGroupLayout],\n });\n const denoiseRadiancePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseRadiancePipelineLayout\",\n bindGroupLayouts: [denoiseRadianceBindGroupLayout],\n });\n const denoiseResolvePipelineLayout = device.createPipelineLayout({\n label: \"plasius.wavefront.denoiseResolvePipelineLayout\",\n bindGroupLayouts: [denoiseResolveBindGroupLayout],\n });\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 const pipelines = {\n prepareMeshTrianglesAndLeaves: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"prepareMeshTrianglesAndLeaves\",\n \"plasius.wavefront.prepareMeshTrianglesAndLeaves\"\n ),\n sortBvhLeafRefs: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"sortBvhLeafRefs\",\n \"plasius.wavefront.sortBvhLeafRefs\"\n ),\n writeSortedBvhLeaves: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"writeSortedBvhLeaves\",\n \"plasius.wavefront.writeSortedBvhLeaves\"\n ),\n buildBvhInternalLevel: await createComputePipeline(\n device,\n computeShader,\n accelerationPipelineLayout,\n \"buildBvhInternalLevel\",\n \"plasius.wavefront.buildBvhInternalLevel\"\n ),\n generatePrimaryRays: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"generatePrimaryRays\",\n \"plasius.wavefront.generatePrimaryRays\"\n ),\n intersectActiveQueue: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"intersectActiveQueue\",\n \"plasius.wavefront.intersectActiveQueue\"\n ),\n resolveSurfaceRecords: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"resolveSurfaceRecords\",\n \"plasius.wavefront.resolveSurfaceRecords\"\n ),\n compactAndSwapQueues: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"compactAndSwapQueues\",\n \"plasius.wavefront.compactAndSwapQueues\"\n ),\n accumulateTerminalRadiance: await createComputePipeline(\n device,\n computeShader,\n tracePipelineLayout,\n \"accumulateTerminalRadiance\",\n \"plasius.wavefront.accumulateTerminalRadiance\"\n ),\n denoiseLinearRadiance: await createComputePipeline(\n device,\n computeShader,\n denoiseRadiancePipelineLayout,\n \"denoiseLinearRadiance\",\n \"plasius.wavefront.denoiseLinearRadiance\"\n ),\n resolveDenoisedOutputImage: await createComputePipeline(\n device,\n computeShader,\n denoiseResolvePipelineLayout,\n \"resolveDenoisedOutputImage\",\n \"plasius.wavefront.resolveDenoisedOutputImage\"\n ),\n };\n\n function createTraceBindGroup(activeBuffer, nextBuffer, label, frameConfigBuffer = configBuffer) {\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 ],\n });\n }\n\n function createTraceBindGroups() {\n return [\n createTraceBindGroup(activeQueue, nextQueue, \"plasius.wavefront.bind.activeNext\"),\n createTraceBindGroup(nextQueue, activeQueue, \"plasius.wavefront.bind.nextActive\"),\n ];\n }\n\n let bindGroups = createTraceBindGroups();\n const bvhBuildBindGroup = 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 function createDenoiseRadianceBindGroup(inputView, targetView, label) {\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\n function createDenoiseResolveBindGroup(inputView, targetView, label) {\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\n const denoiseRadianceBindGroup = createDenoiseRadianceBindGroup(\n radianceView,\n denoiseScratchView,\n \"plasius.wavefront.bind.denoise.radianceToScratch\"\n );\n const denoiseResolveBindGroup = createDenoiseResolveBindGroup(\n denoiseScratchView,\n outputView,\n \"plasius.wavefront.bind.denoise.scratchToOutput\"\n );\n const denoiseDirectResolveBindGroup = createDenoiseResolveBindGroup(\n radianceView,\n outputView,\n \"plasius.wavefront.bind.denoise.radianceToOutput\"\n );\n\n const presentBindGroupLayout = 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 const presentShader = device.createShaderModule({\n label: \"plasius.wavefront.presentShader\",\n code: PRESENT_WGSL,\n });\n const presentPipeline = await 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 const presentBindGroup = 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 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\n function resolveRenderedSamplesPerPixel(renderOptions = {}, awaitGPUCompletion = true) {\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\n function createFrameStats({\n frameIndex,\n accelerationBuildSubmitted,\n frameSubmissionCount,\n parallelismCounters,\n renderedSamplesPerPixel,\n targetSamplesPerPixel,\n frameTimeBudgetMs,\n budgetConstrained,\n }) {\n lastGpuParallelism = createGpuParallelismDiagnostics(gpuAdapterParallelism, parallelismCounters);\n const commandSubmissions = frameSubmissionCount + (accelerationBuildSubmitted ? 1 : 0);\n return 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 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 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: lastGpuParallelism,\n memory: config.memory,\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 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 accelerationBuilt = true;\n accelerationBuildCount += 1;\n return true;\n }\n\n function encodeTileSample(encoder, tile, configOffset, parallelism) {\n const generatePass = encoder.beginComputePass({\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 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 function encodeTileOutput(encoder, tile, configOffset, parallelism) {\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 function encodeDenoise(encoder, configOffset, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\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 function encodePresent(encoder) {\n const texture = context.getCurrentTexture();\n const passEncoder = encoder.beginRenderPass({\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 passEncoder.setPipeline(presentPipeline);\n passEncoder.setBindGroup(0, presentBindGroup);\n passEncoder.draw(3);\n passEncoder.end();\n }\n\n function dispatchFrame(frameIndex, parallelism, renderedSamplesPerPixel = config.samplesPerPixel) {\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 encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n 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 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 encodeDenoise(\n batch.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n encodePresent(batch.reserve(1));\n return batch.flush();\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 });\n }\n\n async function waitForSubmittedGpuWork(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\n function dispatchFrameAwaitingGpu(\n frameIndex,\n parallelism,\n renderedSamplesPerPixel = config.samplesPerPixel,\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 encodeTileSample(\n batch.reserve(config.maxDepth + 1),\n tile,\n configOffset,\n parallelism\n );\n if (config.deferredPathResolve) {\n 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 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 encodeDenoise(\n tail.reserve(denoisePassCount),\n denoiseConfigOffset,\n parallelism,\n renderedSamplesPerPixel\n );\n }\n if (includePresent) {\n encodePresent(tail.reserve(1));\n }\n tail.flush();\n submissionCount += tail.getSubmissionCount();\n }\n return Object.freeze({\n submissionCount,\n slot,\n });\n }\n\n async function readOutputProbe(optionsForProbe = {}) {\n const mapMode = constants.map;\n if (!mapMode) {\n throw new Error(\"GPUMapMode.READ is unavailable in this environment.\");\n }\n const x = clamp(readNonNegativeInteger(\"x\", optionsForProbe.x, Math.floor(config.width / 2)), 0, config.width - 1);\n const y = clamp(readNonNegativeInteger(\"y\", optionsForProbe.y, Math.floor(config.height / 2)), 0, config.height - 1);\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\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 frameStartTimeMs = nowMs();\n let frameStats;\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 const frameTimeMs = Math.max(0, nowMs() - frameStartTimeMs);\n if (awaitGPUCompletion) {\n lastCompletedFrameTimeMs = frameTimeMs;\n lastCompletedSamplesPerPixel = frameStats.renderedSamplesPerPixel ?? frameStats.samplesPerPixel;\n }\n frameStats = Object.freeze({\n ...frameStats,\n gpuWorkerJobs: createGpuWorkerJobDiagnostics(\n frameStats.gpuParallelism,\n frameStats.commandSubmissions,\n frameTimeMs,\n awaitGPUCompletion\n ),\n });\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 return 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: Object.freeze({\n emissive: 0,\n environment: 0,\n ambientFallback: 0,\n maxDepth: 0,\n }),\n queueOverflow: 0,\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 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 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 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 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 function createWavefrontPathTracingComputeShaderSource(options = {}) {\n const workgroupSize = readPositiveInteger(\n \"workgroupSize\",\n options.workgroupSize ?? rendererWavefrontComputeWorkgroupSize,\n rendererWavefrontComputeWorkgroupSize\n );\n if (workgroupSize !== rendererWavefrontComputeWorkgroupSize) {\n throw new Error(`wavefront mesh compute currently requires workgroupSize=${rendererWavefrontComputeWorkgroupSize}.`);\n }\n return WAVEFRONT_COMPUTE_WGSL;\n}\n","const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nconst DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\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 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\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 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 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 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\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 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\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\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 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\nfunction 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\nfunction 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\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 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 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 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"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAs4E/B,IAAM,eAAe;AAAA;AAAA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","names":["options","readPositiveInteger","readNonNegativeInteger","resolveCanvas"]}