@plasius/gpu-shared 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +19 -1
- package/dist/index.cjs +43 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{showcase-runtime-67CHJBNO.js → showcase-runtime-V72XV55N.js} +44 -10
- package/dist/{showcase-runtime-67CHJBNO.js.map → showcase-runtime-V72XV55N.js.map} +1 -1
- package/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/showcase-runtime.js +48 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gltf-loader.js","../node_modules/@plasius/gpu-cloth/src/types.ts","../node_modules/@plasius/gpu-cloth/src/validation.ts","../node_modules/@plasius/gpu-cloth/src/continuity.ts","../node_modules/@plasius/gpu-cloth/src/representation.ts","../node_modules/@plasius/gpu-cloth/src/worker.ts","../node_modules/@plasius/gpu-fluid/src/types.ts","../node_modules/@plasius/gpu-fluid/src/validation.ts","../node_modules/@plasius/gpu-fluid/src/continuity.ts","../node_modules/@plasius/gpu-fluid/src/representation.ts","../node_modules/@plasius/gpu-fluid/src/worker.ts","../node_modules/@plasius/gpu-lighting/src/index.js","../node_modules/@plasius/gpu-performance/src/validation.ts","../node_modules/@plasius/gpu-performance/src/device.ts","../node_modules/@plasius/gpu-performance/src/budget.ts","../node_modules/@plasius/gpu-performance/src/governor.ts","../node_modules/@plasius/gpu-performance/src/ladder.ts","../node_modules/@plasius/gpu-performance/src/worker.ts","../node_modules/@plasius/gpu-debug/src/validation.ts","../node_modules/@plasius/gpu-debug/src/session.ts","../node_modules/@plasius/gpu-physics/src/browser.js","../node_modules/@plasius/gpu-physics/dist/browser.js","../src/showcase-runtime.js","../src/index.js"],"sourcesContent":["function decodeDataUri(uri) {\n const match = /^data:.*?;base64,(.+)$/i.exec(uri);\n if (!match) {\n throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);\n }\n\n const binary = atob(match[1]);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes.buffer;\n}\n\nfunction getComponentArray(componentType, buffer, byteOffset, count) {\n switch (componentType) {\n case 5123:\n return new Uint16Array(buffer, byteOffset, count);\n case 5125:\n return new Uint32Array(buffer, byteOffset, count);\n case 5126:\n return new Float32Array(buffer, byteOffset, count);\n default:\n throw new Error(`Unsupported glTF componentType: ${componentType}`);\n }\n}\n\nfunction getTypeSize(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n default:\n throw new Error(`Unsupported glTF accessor type: ${type}`);\n }\n}\n\nfunction readAccessor(document, accessorIndex, buffers) {\n const accessor = document.accessors[accessorIndex];\n const bufferView = document.bufferViews[accessor.bufferView];\n const buffer = buffers[bufferView.buffer];\n const componentCount = getTypeSize(accessor.type);\n const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);\n const valueCount = accessor.count * componentCount;\n return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);\n}\n\nfunction getMaterialColor(document, primitive) {\n const material = document.materials?.[primitive.material] ?? null;\n const factor =\n material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];\n return {\n r: factor[0],\n g: factor[1],\n b: factor[2],\n a: factor[3] ?? 1,\n };\n}\n\nfunction computeBounds(positions) {\n const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];\n const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];\n for (let index = 0; index < positions.length; index += 3) {\n min[0] = Math.min(min[0], positions[index]);\n min[1] = Math.min(min[1], positions[index + 1]);\n min[2] = Math.min(min[2], positions[index + 2]);\n max[0] = Math.max(max[0], positions[index]);\n max[1] = Math.max(max[1], positions[index + 1]);\n max[2] = Math.max(max[2], positions[index + 2]);\n }\n return { min, max };\n}\n\nexport async function loadGltfModel(url) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);\n }\n\n const document = await response.json();\n const buffers = await Promise.all(\n (document.buffers ?? []).map(async (buffer) => {\n if (typeof buffer.uri !== \"string\") {\n throw new Error(\"glTF buffer URI is required for demo asset loading.\");\n }\n if (buffer.uri.startsWith(\"data:\")) {\n return decodeDataUri(buffer.uri);\n }\n const nested = await fetch(new URL(buffer.uri, url));\n if (!nested.ok) {\n throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);\n }\n return nested.arrayBuffer();\n })\n );\n\n const scene = document.scenes?.[document.scene ?? 0];\n if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {\n throw new Error(\"glTF demo asset must expose a default scene with at least one node.\");\n }\n\n const node = document.nodes[scene.nodes[0]];\n const mesh = document.meshes[node.mesh];\n const primitive = mesh.primitives[0];\n const positions = Array.from(readAccessor(document, primitive.attributes.POSITION, buffers));\n const indices = Array.from(readAccessor(document, primitive.indices, buffers));\n\n return Object.freeze({\n name: node.name ?? mesh.name ?? \"gltf-model\",\n positions,\n indices,\n bounds: computeBounds(positions),\n color: getMaterialColor(document, primitive),\n physics: Object.freeze({ ...(node.extras?.physics ?? {}) }),\n });\n}\n","/**\n * Supported cloth planning profiles.\n */\nexport const clothProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Cloth planning profile identifier.\n */\nexport type ClothProfileName = (typeof clothProfileNames)[number];\n\n/**\n * Cloth asset categories currently modeled by the package.\n */\nexport const clothGarmentKinds = [\n \"cape\",\n \"skirt\",\n \"flag\",\n \"curtain\",\n \"custom\",\n] as const;\n\n/**\n * Cloth garment kind.\n */\nexport type ClothGarmentKind = (typeof clothGarmentKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const clothRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type ClothRepresentationBand = (typeof clothRepresentationBands)[number];\n\n/**\n * Supported render outputs for each cloth band.\n */\nexport const clothRepresentationOutputs = [\n \"fullSimulation\",\n \"reducedSimulation\",\n \"poseProxy\",\n \"silhouetteImpression\",\n] as const;\n\n/**\n * Render output type for a banded cloth representation.\n */\nexport type ClothRepresentationOutput =\n (typeof clothRepresentationOutputs)[number];\n\n/**\n * Cloth continuity strategies across range transitions.\n */\nexport const clothContinuityStrategies = [\n \"shared-solver-state\",\n \"shared-motion-field\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type ClothContinuityStrategy =\n (typeof clothContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const clothRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type ClothRtParticipation = (typeof clothRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a cloth representation.\n */\nexport const clothShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type ClothShadowMode = (typeof clothShadowModes)[number];\n\n/**\n * Worker queues used by cloth preparation.\n */\nexport const clothWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type ClothWorkerQueueClass =\n (typeof clothWorkerQueueClasses)[number];\n\n/**\n * Safety classification for cloth jobs.\n */\nexport const clothWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type ClothWorkerAuthority =\n (typeof clothWorkerAuthorities)[number];\n\n/**\n * Importance ranking for cloth jobs.\n */\nexport const clothWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type ClothWorkerImportance =\n (typeof clothWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const clothPerformanceDomains = [\n \"cloth\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by cloth jobs.\n */\nexport type ClothPerformanceDomain =\n (typeof clothPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const clothMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type ClothMotionClass = (typeof clothMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceQualityDimensions {\n geometry?: number;\n deformation?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: ClothMotionClass;\n shadowSignificance?: ClothWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface ClothContinuityBandInput {\n blendWindowMeters?: number;\n silhouetteFloor?: number;\n broadMotionFloor?: number;\n wrinkleFloor?: number;\n retainPinnedAnchors?: boolean;\n retainWindPhase?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface ClothContinuityEnvelopeInput {\n garmentId: string;\n continuityGroupId?: string;\n motionFieldId?: string;\n strategy?: ClothContinuityStrategy;\n bands?: Partial<Record<ClothRepresentationBand, ClothContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface ClothContinuityBandSettings {\n inheritsFromBand?: ClothRepresentationBand;\n blendWindowMeters: number;\n silhouetteFloor: number;\n broadMotionFloor: number;\n wrinkleFloor: number;\n retainPinnedAnchors: boolean;\n retainWindPhase: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface ClothContinuityEnvelope {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n bands: Readonly<Record<ClothRepresentationBand, ClothContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a cloth band.\n */\nexport interface ClothRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Mesh and solver hints for a representation band.\n */\nexport interface ClothMeshResolution {\n simulationVertices: number;\n collisionSamples: number;\n solverIterations: number;\n wrinkleLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface ClothShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n selfShadowing: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface ClothRepresentationPerformanceHints {\n owner: \"cloth\";\n queueClass: \"render\";\n priorityHint: number;\n importance: ClothWorkerImportance;\n representationBand: ClothRepresentationBand;\n qualityDimensions: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals: Readonly<ClothPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface ClothRepresentationDescriptor {\n id: string;\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n band: ClothRepresentationBand;\n output: ClothRepresentationOutput;\n mesh: Readonly<ClothMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: ClothRtParticipation;\n shadowMode: ClothShadowMode;\n shading: Readonly<ClothShadingPlan>;\n continuity: Readonly<ClothContinuityBandSettings> & {\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n };\n performance: Readonly<ClothRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface ClothRepresentationPlanOptions {\n garmentId: string;\n kind?: ClothGarmentKind;\n profile?: ClothProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<ClothContinuityEnvelopeInput, \"garmentId\">>;\n}\n\n/**\n * Full cloth representation plan.\n */\nexport interface ClothRepresentationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<ClothRangeThresholds>;\n continuity: Readonly<ClothContinuityEnvelope>;\n bands: readonly ClothRepresentationBand[];\n representations: readonly ClothRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface ClothWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the cloth package.\n */\nexport interface ClothWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n levels: readonly ClothWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface ClothWorkerManifest {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly ClothWorkerManifestJob[];\n}\n\n/**\n * Ordered cloth simulation stages.\n */\nexport const clothSimulationStageOrder = [\n \"snapshot-ingest\",\n \"wind-field-advance\",\n \"pin-constraint-update\",\n \"cloth-solve\",\n \"near-cloth\",\n \"mid-cloth\",\n \"far-proxy\",\n \"horizon-impression\",\n \"wrinkle-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Cloth simulation stage identifier.\n */\nexport type ClothSimulationStageId =\n (typeof clothSimulationStageOrder)[number];\n\n/**\n * One stage in the cloth simulation/scene-prep plan.\n */\nexport interface ClothSimulationPlanStage {\n id: ClothSimulationStageId;\n label: string;\n queueClass: ClothWorkerQueueClass;\n root: boolean;\n dependencies: readonly ClothSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the cloth package.\n */\nexport interface ClothSimulationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: ClothContinuityStrategy;\n requiresSharedMotionField: true;\n bands: readonly ClothRepresentationBand[];\n }>;\n stages: readonly ClothSimulationPlanStage[];\n}\n","import {\n clothContinuityStrategies,\n clothGarmentKinds,\n clothProfileNames,\n clothRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\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\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeClothProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, clothProfileNames);\n}\n\nexport function normalizeClothGarmentKind(value: unknown) {\n return assertEnumValue(\"kind\", value, clothGarmentKinds);\n}\n\nexport function normalizeClothContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, clothContinuityStrategies);\n}\n\nexport function normalizeClothRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, clothRepresentationBands);\n}\n","import type {\n ClothContinuityBandInput,\n ClothContinuityBandSettings,\n ClothContinuityEnvelope,\n ClothContinuityEnvelopeInput,\n ClothRepresentationBand,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFinitePositiveNumber,\n assertIdentifier,\n assertRatio,\n normalizeClothContinuityStrategy,\n} from \"./validation.js\";\n\nconst clothBandInheritance: Readonly<\n Record<ClothRepresentationBand, ClothRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<ClothRepresentationBand, Required<ClothContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 3,\n silhouetteFloor: 1,\n broadMotionFloor: 1,\n wrinkleFloor: 1,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 8,\n silhouetteFloor: 0.82,\n broadMotionFloor: 0.78,\n wrinkleFloor: 0.5,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 20,\n silhouetteFloor: 0.58,\n broadMotionFloor: 0.48,\n wrinkleFloor: 0.2,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 40,\n silhouetteFloor: 0.28,\n broadMotionFloor: 0.24,\n wrinkleFloor: 0.05,\n retainPinnedAnchors: true,\n retainWindPhase: false,\n }),\n});\n\nfunction buildBandSettings(\n band: ClothRepresentationBand,\n input: ClothContinuityBandInput | undefined\n): ClothContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: clothBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n silhouetteFloor:\n input?.silhouetteFloor === undefined\n ? defaults.silhouetteFloor\n : assertRatio(\n `continuity.bands.${band}.silhouetteFloor`,\n input.silhouetteFloor\n ),\n broadMotionFloor:\n input?.broadMotionFloor === undefined\n ? defaults.broadMotionFloor\n : assertRatio(\n `continuity.bands.${band}.broadMotionFloor`,\n input.broadMotionFloor\n ),\n wrinkleFloor:\n input?.wrinkleFloor === undefined\n ? defaults.wrinkleFloor\n : assertRatio(\n `continuity.bands.${band}.wrinkleFloor`,\n input.wrinkleFloor\n ),\n retainPinnedAnchors:\n input?.retainPinnedAnchors ?? defaults.retainPinnedAnchors,\n retainWindPhase: input?.retainWindPhase ?? defaults.retainWindPhase,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all cloth\n * representation bands.\n */\nexport function createClothContinuityEnvelope(\n input: ClothContinuityEnvelopeInput\n): ClothContinuityEnvelope {\n const garmentId = assertIdentifier(\"garmentId\", input.garmentId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${garmentId}.continuity`;\n const motionFieldId = input.motionFieldId\n ? assertIdentifier(\"motionFieldId\", input.motionFieldId)\n : `${garmentId}.motion-field`;\n const strategy = input.strategy\n ? normalizeClothContinuityStrategy(input.strategy)\n : \"shared-motion-field\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n clothRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<ClothRepresentationBand, ClothContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n continuityGroupId,\n motionFieldId,\n strategy,\n bands,\n });\n}\n","import { createClothContinuityEnvelope } from \"./continuity.js\";\nimport type {\n ClothGarmentKind,\n ClothProfileName,\n ClothRangeThresholds,\n ClothRepresentationBand,\n ClothRepresentationDescriptor,\n ClothRepresentationPlan,\n ClothRepresentationPlanOptions,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeClothGarmentKind,\n normalizeClothProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n ClothRepresentationDescriptor,\n | \"id\"\n | \"garmentId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<ClothRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<ClothProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 12000,\n collisionSamples: 96,\n solverIterations: 10,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 450,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 4200,\n collisionSamples: 40,\n solverIterations: 6,\n wrinkleLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 320,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 700,\n collisionSamples: 8,\n solverIterations: 2,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 200,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 80,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 100,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 18000,\n collisionSamples: 128,\n solverIterations: 14,\n wrinkleLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 490,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.9,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 6800,\n collisionSamples: 56,\n solverIterations: 8,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 350,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.76,\n deformation: 0.8,\n shading: 0.7,\n rayTracing: 0.5,\n updateCadence: 0.82,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 1200,\n collisionSamples: 12,\n solverIterations: 3,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.35,\n deformation: 0.38,\n shading: 0.3,\n rayTracing: 0.12,\n updateCadence: 0.35,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 120,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): ClothRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Cloth range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n garmentId: string,\n kind: ClothGarmentKind,\n profile: ClothProfileName,\n band: ClothRepresentationBand,\n supportsRayTracing: boolean,\n options: ClothRepresentationPlanOptions\n): ClothRepresentationDescriptor {\n const continuityEnvelope = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${garmentId}.${band}.${profileSpec.output}`,\n garmentId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n motionFieldId: continuityEnvelope.motionFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n silhouetteFloor: continuity.silhouetteFloor,\n broadMotionFloor: continuity.broadMotionFloor,\n wrinkleFloor: continuity.wrinkleFloor,\n retainPinnedAnchors: continuity.retainPinnedAnchors,\n retainWindPhase: continuity.retainWindPhase,\n }),\n performance: profileSpec.performance,\n });\n}\n\n/**\n * Selects the active cloth representation band for a given distance.\n */\nexport function selectClothRepresentationBand(\n distanceMeters: number,\n thresholds: ClothRangeThresholds\n): ClothRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware cloth representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createClothRepresentationPlan(\n options: ClothRepresentationPlanOptions\n): ClothRepresentationPlan {\n const garmentId = assertIdentifier(\"garmentId\", options.garmentId);\n const kind = options.kind\n ? normalizeClothGarmentKind(options.kind)\n : \"cape\";\n const profile = options.profile\n ? normalizeClothProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 18,\n options.midFieldMaxMeters ?? 55,\n options.farFieldMaxMeters ?? 180\n );\n const continuity = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: clothRepresentationBands,\n representations: Object.freeze(\n clothRepresentationBands.map((band) =>\n buildRepresentationDescriptor(garmentId, kind, profile, band, supportsRayTracing, options)\n )\n ),\n });\n}\n","import type {\n ClothPerformanceDomain,\n ClothPerformanceImportanceSignals,\n ClothPerformanceQualityDimensions,\n ClothProfileName,\n ClothRepresentationBand,\n ClothSimulationPlan,\n ClothSimulationPlanStage,\n ClothSimulationStageId,\n ClothWorkerAuthority,\n ClothWorkerBudgetLevel,\n ClothWorkerImportance,\n ClothWorkerManifest,\n ClothWorkerManifestJob,\n ClothWorkerQueueClass,\n} from \"./types.js\";\nimport { clothProfileNames, clothRepresentationBands } from \"./types.js\";\nimport { normalizeClothProfile } from \"./validation.js\";\n\nexport const clothDebugOwner = \"cloth\";\nexport const defaultClothProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<ClothSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"wind-field-advance\": \"Advance wind and external force field\",\n \"pin-constraint-update\": \"Resolve pin and attachment constraints\",\n \"cloth-solve\": \"Solve cloth state\",\n \"near-cloth\": \"Prepare near-field cloth simulation output\",\n \"mid-cloth\": \"Prepare mid-field cloth simulation output\",\n \"far-proxy\": \"Prepare far-field garment proxy\",\n \"horizon-impression\": \"Prepare horizon silhouette impression\",\n \"wrinkle-history\": \"Propagate wrinkle and crease history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: ClothSimulationPlanStage\n): ClothSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: ClothWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly ClothWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"cloth\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: ClothProfileName,\n key: string,\n spec: WorkerJobSpec\n): ClothWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"cloth\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"cloth\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive cloth profile that preserves stable attachment and silhouette continuity while scaling distant garment cost before near-field fidelity.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"cloth.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.snapshot\"]),\n levels: {\n low: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 64, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"wind-field-advance\": Object.freeze({\n label: \"cloth.wind-field-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.wind\"]),\n levels: {\n low: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.7, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"pin-constraint-update\": Object.freeze({\n label: \"cloth.pin-constraint-update\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.pins\"]),\n levels: {\n low: { estimatedCostMs: 0.35, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.55, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"cloth-solve\": Object.freeze({\n label: \"cloth.solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"pin-constraint-update\", \"wind-field-advance\"]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.solve\"]),\n levels: {\n low: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 1.9, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"near-cloth\": Object.freeze({\n label: \"cloth.near-cloth\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.near\"]),\n levels: {\n low: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 1.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n high: { estimatedCostMs: 2.2, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n },\n }),\n \"mid-cloth\": Object.freeze({\n label: \"cloth.mid-cloth\",\n queueClass: \"render\",\n priority: 320,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.mid\"]),\n levels: {\n low: { estimatedCostMs: 0.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.55, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.72, maxQueueDepth: 64 },\n high: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 20, cadenceDivisor: 1, workgroupScale: 0.9, maxQueueDepth: 96 },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"cloth.far-proxy\",\n queueClass: \"render\",\n priority: 200,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.far\"]),\n levels: {\n low: { estimatedCostMs: 0.15, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.4, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 4, workgroupScale: 0.55, maxQueueDepth: 32 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 3, workgroupScale: 0.7, maxQueueDepth: 48 },\n },\n }),\n \"horizon-impression\": Object.freeze({\n label: \"cloth.horizon-impression\",\n queueClass: \"render\",\n priority: 100,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.horizon\"]),\n levels: {\n low: { estimatedCostMs: 0.08, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 4, cadenceDivisor: 10, workgroupScale: 0.25, maxQueueDepth: 16 },\n medium: { estimatedCostMs: 0.12, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 6, cadenceDivisor: 8, workgroupScale: 0.35, maxQueueDepth: 24 },\n high: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.45, maxQueueDepth: 32 },\n },\n }),\n \"wrinkle-history\": Object.freeze({\n label: \"cloth.wrinkle-history\",\n queueClass: \"render\",\n priority: 300,\n dependencies: Object.freeze([\"near-cloth\", \"mid-cloth\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n deformation: 0.5,\n shading: 0.4,\n updateCadence: 0.5,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.wrinkles\"]),\n levels: {\n low: { estimatedCostMs: 0.18, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 3, workgroupScale: 0.45, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.65, maxQueueDepth: 48 },\n high: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic cloth profile that spends more budget on near and mid-field garment deformation before degrading distant cloth work.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-cloth\" || key === \"mid-cloth\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: { ...spec.levels.low, estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)) },\n medium: { ...spec.levels.medium, estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)) },\n high: { ...spec.levels.high, estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)) },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst clothWorkerProfileSpecs: Readonly<Record<ClothProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze([\n createSimulationStage({ id: \"snapshot-ingest\", label: simulationStageLabels[\"snapshot-ingest\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"physics-snapshot\", snapshotStable: true }),\n createSimulationStage({ id: \"wind-field-advance\", label: simulationStageLabels[\"wind-field-advance\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"wind-field\", snapshotStable: false }),\n createSimulationStage({ id: \"pin-constraint-update\", label: simulationStageLabels[\"pin-constraint-update\"], queueClass: \"simulation\", root: false, dependencies: [\"snapshot-ingest\"], output: \"pin-constraints\", snapshotStable: true }),\n createSimulationStage({ id: \"cloth-solve\", label: simulationStageLabels[\"cloth-solve\"], queueClass: \"simulation\", root: false, dependencies: [\"pin-constraint-update\", \"wind-field-advance\"], output: \"cloth-state\", snapshotStable: true }),\n createSimulationStage({ id: \"near-cloth\", label: simulationStageLabels[\"near-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"near-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"mid-cloth\", label: simulationStageLabels[\"mid-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"mid-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"far-proxy\", label: simulationStageLabels[\"far-proxy\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"far-proxy-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"horizon-impression\", label: simulationStageLabels[\"horizon-impression\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"horizon-cloth-impression\", snapshotStable: true }),\n createSimulationStage({ id: \"wrinkle-history\", label: simulationStageLabels[\"wrinkle-history\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\"], output: \"wrinkle-history-state\", snapshotStable: true }),\n createSimulationStage({ id: \"render-snapshot\", label: simulationStageLabels[\"render-snapshot\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\", \"far-proxy\", \"horizon-impression\", \"wrinkle-history\"], output: \"cloth-render-snapshot\", snapshotStable: true }),\n]);\n\nconst cinematicSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-impression\"\n ? createSimulationStage({\n ...stage,\n output:\n stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-cloth-impression-cinematic\",\n })\n : stage\n )\n);\n\nconst clothSimulationPlanSpecs: Readonly<\n Record<ClothProfileName, readonly ClothSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected cloth profile.\n */\nexport function getClothWorkerManifest(\n profile: ClothProfileName = defaultClothProfile\n): ClothWorkerManifest {\n const profileName = normalizeClothProfile(profile);\n const spec = clothWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level cloth simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createClothSimulationPlan(\n profile: ClothProfileName = defaultClothProfile\n): ClothSimulationPlan {\n const profileName = normalizeClothProfile(profile);\n const stages = clothSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n description: clothWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-motion-field\",\n requiresSharedMotionField: true,\n bands: clothRepresentationBands,\n }),\n stages,\n });\n}\n","/**\n * Supported fluid planning profiles.\n */\nexport const fluidProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Fluid planning profile identifier.\n */\nexport type FluidProfileName = (typeof fluidProfileNames)[number];\n\n/**\n * Fluid body categories currently modeled by the package.\n */\nexport const fluidBodyKinds = [\n \"ocean\",\n \"lake\",\n \"river\",\n \"waterfall\",\n \"custom\",\n] as const;\n\n/**\n * Fluid body kind.\n */\nexport type FluidBodyKind = (typeof fluidBodyKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const fluidRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type FluidRepresentationBand = (typeof fluidRepresentationBands)[number];\n\n/**\n * Supported render outputs for each fluid band.\n */\nexport const fluidRepresentationOutputs = [\n \"liveSurface\",\n \"simplifiedSurface\",\n \"mergedProxy\",\n \"horizonShell\",\n] as const;\n\n/**\n * Render output type for a banded fluid representation.\n */\nexport type FluidRepresentationOutput =\n (typeof fluidRepresentationOutputs)[number];\n\n/**\n * Fluid continuity strategies across range transitions.\n */\nexport const fluidContinuityStrategies = [\n \"shared-spectrum\",\n \"shared-heightfield\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type FluidContinuityStrategy =\n (typeof fluidContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const fluidRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type FluidRtParticipation = (typeof fluidRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a fluid representation.\n */\nexport const fluidShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type FluidShadowMode = (typeof fluidShadowModes)[number];\n\n/**\n * Worker queues used by fluid preparation.\n */\nexport const fluidWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type FluidWorkerQueueClass =\n (typeof fluidWorkerQueueClasses)[number];\n\n/**\n * Safety classification for fluid jobs.\n */\nexport const fluidWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type FluidWorkerAuthority =\n (typeof fluidWorkerAuthorities)[number];\n\n/**\n * Importance ranking for fluid jobs.\n */\nexport const fluidWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type FluidWorkerImportance =\n (typeof fluidWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const fluidPerformanceDomains = [\n \"physics\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by fluid jobs.\n */\nexport type FluidPerformanceDomain =\n (typeof fluidPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const fluidMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type FluidMotionClass = (typeof fluidMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceQualityDimensions {\n geometry?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: FluidMotionClass;\n shadowSignificance?: FluidWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface FluidContinuityBandInput {\n blendWindowMeters?: number;\n amplitudeFloor?: number;\n frequencyFloor?: number;\n retainFoamHistory?: boolean;\n retainLowFrequencyWaves?: boolean;\n retainDirectionality?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface FluidContinuityEnvelopeInput {\n fluidBodyId: string;\n continuityGroupId?: string;\n waveFieldId?: string;\n strategy?: FluidContinuityStrategy;\n bands?: Partial<Record<FluidRepresentationBand, FluidContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface FluidContinuityBandSettings {\n inheritsFromBand?: FluidRepresentationBand;\n blendWindowMeters: number;\n amplitudeFloor: number;\n frequencyFloor: number;\n retainFoamHistory: boolean;\n retainLowFrequencyWaves: boolean;\n retainDirectionality: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface FluidContinuityEnvelope {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n bands: Readonly<Record<FluidRepresentationBand, FluidContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a fluid band.\n */\nexport interface FluidRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Resolution hints for a representation band.\n */\nexport interface FluidMeshResolution {\n patchSizeMeters: number;\n subdivisions: number;\n activeWaveOctaves: number;\n foamLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface FluidShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n caustics: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface FluidRepresentationPerformanceHints {\n owner: \"fluid\";\n queueClass: \"render\";\n priorityHint: number;\n importance: FluidWorkerImportance;\n representationBand: FluidRepresentationBand;\n qualityDimensions: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals: Readonly<FluidPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface FluidRepresentationDescriptor {\n id: string;\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n band: FluidRepresentationBand;\n output: FluidRepresentationOutput;\n mesh: Readonly<FluidMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: FluidRtParticipation;\n shadowMode: FluidShadowMode;\n shading: Readonly<FluidShadingPlan>;\n continuity: Readonly<FluidContinuityBandSettings> & {\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n };\n performance: Readonly<FluidRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface FluidRepresentationPlanOptions {\n fluidBodyId: string;\n kind?: FluidBodyKind;\n profile?: FluidProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<FluidContinuityEnvelopeInput, \"fluidBodyId\">>;\n}\n\n/**\n * Full fluid representation plan.\n */\nexport interface FluidRepresentationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<FluidRangeThresholds>;\n continuity: Readonly<FluidContinuityEnvelope>;\n bands: readonly FluidRepresentationBand[];\n representations: readonly FluidRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface FluidWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the fluid package.\n */\nexport interface FluidWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n levels: readonly FluidWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface FluidWorkerManifest {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly FluidWorkerManifestJob[];\n}\n\n/**\n * Ordered fluid simulation stages.\n */\nexport const fluidSimulationStageOrder = [\n \"snapshot-ingest\",\n \"spectrum-advance\",\n \"boundary-coupling\",\n \"surface-solve\",\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Fluid simulation stage identifier.\n */\nexport type FluidSimulationStageId =\n (typeof fluidSimulationStageOrder)[number];\n\n/**\n * One stage in the fluid simulation/scene-prep plan.\n */\nexport interface FluidSimulationPlanStage {\n id: FluidSimulationStageId;\n label: string;\n queueClass: FluidWorkerQueueClass;\n root: boolean;\n dependencies: readonly FluidSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the fluid package.\n */\nexport interface FluidSimulationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: FluidContinuityStrategy;\n requiresSharedWaveField: true;\n bands: readonly FluidRepresentationBand[];\n }>;\n stages: readonly FluidSimulationPlanStage[];\n}\n","import {\n fluidBodyKinds,\n fluidContinuityStrategies,\n fluidProfileNames,\n fluidRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\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\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeFluidProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, fluidProfileNames);\n}\n\nexport function normalizeFluidBodyKind(value: unknown) {\n return assertEnumValue(\"kind\", value, fluidBodyKinds);\n}\n\nexport function normalizeFluidContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, fluidContinuityStrategies);\n}\n\nexport function normalizeFluidRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, fluidRepresentationBands);\n}\n","import type {\n FluidContinuityBandInput,\n FluidContinuityBandSettings,\n FluidContinuityEnvelope,\n FluidContinuityEnvelopeInput,\n FluidRepresentationBand,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertIdentifier,\n assertFinitePositiveNumber,\n assertRatio,\n normalizeFluidContinuityStrategy,\n} from \"./validation.js\";\n\nconst fluidBandInheritance: Readonly<\n Record<FluidRepresentationBand, FluidRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<FluidRepresentationBand, Required<FluidContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 6,\n amplitudeFloor: 1,\n frequencyFloor: 1,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 14,\n amplitudeFloor: 0.72,\n frequencyFloor: 0.78,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 32,\n amplitudeFloor: 0.34,\n frequencyFloor: 0.42,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 72,\n amplitudeFloor: 0.16,\n frequencyFloor: 0.18,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n});\n\nfunction buildBandSettings(\n band: FluidRepresentationBand,\n input: FluidContinuityBandInput | undefined\n): FluidContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: fluidBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n amplitudeFloor:\n input?.amplitudeFloor === undefined\n ? defaults.amplitudeFloor\n : assertRatio(\n `continuity.bands.${band}.amplitudeFloor`,\n input.amplitudeFloor\n ),\n frequencyFloor:\n input?.frequencyFloor === undefined\n ? defaults.frequencyFloor\n : assertRatio(\n `continuity.bands.${band}.frequencyFloor`,\n input.frequencyFloor\n ),\n retainFoamHistory: input?.retainFoamHistory ?? defaults.retainFoamHistory,\n retainLowFrequencyWaves:\n input?.retainLowFrequencyWaves ?? defaults.retainLowFrequencyWaves,\n retainDirectionality:\n input?.retainDirectionality ?? defaults.retainDirectionality,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all fluid\n * representation bands.\n */\nexport function createFluidContinuityEnvelope(\n input: FluidContinuityEnvelopeInput\n): FluidContinuityEnvelope {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", input.fluidBodyId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${fluidBodyId}.continuity`;\n const waveFieldId = input.waveFieldId\n ? assertIdentifier(\"waveFieldId\", input.waveFieldId)\n : `${fluidBodyId}.wave-field`;\n const strategy = input.strategy\n ? normalizeFluidContinuityStrategy(input.strategy)\n : \"shared-spectrum\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n fluidRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<FluidRepresentationBand, FluidContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n continuityGroupId,\n waveFieldId,\n strategy,\n bands,\n });\n}\n","import { createFluidContinuityEnvelope } from \"./continuity.js\";\nimport type {\n FluidBodyKind,\n FluidProfileName,\n FluidRangeThresholds,\n FluidRepresentationBand,\n FluidRepresentationDescriptor,\n FluidRepresentationPlan,\n FluidRepresentationPlanOptions,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeFluidBodyKind,\n normalizeFluidProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n FluidRepresentationDescriptor,\n | \"id\"\n | \"fluidBodyId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<FluidRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<FluidProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.5,\n subdivisions: 256,\n activeWaveOctaves: 8,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 460,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1.5,\n subdivisions: 128,\n activeWaveOctaves: 6,\n foamLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 330,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 6,\n subdivisions: 48,\n activeWaveOctaves: 4,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 210,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 24,\n subdivisions: 12,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.35,\n subdivisions: 320,\n activeWaveOctaves: 9,\n foamLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 500,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1,\n subdivisions: 192,\n activeWaveOctaves: 7,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 360,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.8,\n shading: 0.78,\n rayTracing: 0.64,\n updateCadence: 0.74,\n temporalReuse: 0.45,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 4,\n subdivisions: 80,\n activeWaveOctaves: 5,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.4,\n shading: 0.42,\n rayTracing: 0.24,\n updateCadence: 0.34,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 18,\n subdivisions: 18,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 120,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.14,\n shading: 0.18,\n rayTracing: 0,\n updateCadence: 0.12,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): FluidRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Fluid range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n fluidBodyId: string,\n kind: FluidBodyKind,\n profile: FluidProfileName,\n band: FluidRepresentationBand,\n supportsRayTracing: boolean,\n thresholds: FluidRangeThresholds,\n options: FluidRepresentationPlanOptions\n): FluidRepresentationDescriptor {\n const continuityEnvelope = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${fluidBodyId}.${band}.${profileSpec.output}`,\n fluidBodyId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n waveFieldId: continuityEnvelope.waveFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n amplitudeFloor: continuity.amplitudeFloor,\n frequencyFloor: continuity.frequencyFloor,\n retainFoamHistory: continuity.retainFoamHistory,\n retainLowFrequencyWaves: continuity.retainLowFrequencyWaves,\n retainDirectionality: continuity.retainDirectionality,\n }),\n performance: Object.freeze({\n ...profileSpec.performance,\n importanceSignals: Object.freeze({\n ...profileSpec.performance.importanceSignals,\n visible: band === \"near\" ? true : thresholds.nearMaxMeters > 0,\n }),\n }),\n });\n}\n\n/**\n * Selects the active fluid representation band for a given distance.\n */\nexport function selectFluidRepresentationBand(\n distanceMeters: number,\n thresholds: FluidRangeThresholds\n): FluidRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware fluid representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createFluidRepresentationPlan(\n options: FluidRepresentationPlanOptions\n): FluidRepresentationPlan {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", options.fluidBodyId);\n const kind = options.kind\n ? normalizeFluidBodyKind(options.kind)\n : \"ocean\";\n const profile = options.profile\n ? normalizeFluidProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 40,\n options.midFieldMaxMeters ?? 160,\n options.farFieldMaxMeters ?? 700\n );\n const continuity = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: fluidRepresentationBands,\n representations: Object.freeze(\n fluidRepresentationBands.map((band) =>\n buildRepresentationDescriptor(\n fluidBodyId,\n kind,\n profile,\n band,\n supportsRayTracing,\n thresholds,\n options\n )\n )\n ),\n });\n}\n","import type {\n FluidPerformanceDomain,\n FluidPerformanceImportanceSignals,\n FluidPerformanceQualityDimensions,\n FluidProfileName,\n FluidRepresentationBand,\n FluidSimulationPlan,\n FluidSimulationPlanStage,\n FluidSimulationStageId,\n FluidWorkerAuthority,\n FluidWorkerBudgetLevel,\n FluidWorkerImportance,\n FluidWorkerManifest,\n FluidWorkerManifestJob,\n FluidWorkerQueueClass,\n} from \"./types.js\";\nimport { fluidProfileNames, fluidRepresentationBands } from \"./types.js\";\nimport { normalizeFluidProfile } from \"./validation.js\";\n\nexport const fluidDebugOwner = \"fluid\";\nexport const defaultFluidProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<FluidSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"spectrum-advance\": \"Advance shared wave spectrum\",\n \"boundary-coupling\": \"Resolve boundaries and buoyancy coupling\",\n \"surface-solve\": \"Solve fluid surface state\",\n \"near-surface\": \"Prepare near-field live surface\",\n \"mid-surface\": \"Prepare mid-field simplified surface\",\n \"far-proxy\": \"Prepare far-field merged proxy\",\n \"horizon-shell\": \"Prepare horizon shell\",\n \"foam-history\": \"Propagate foam and crest history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: FluidSimulationPlanStage\n): FluidSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: FluidWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly FluidWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"fluid\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: FluidProfileName,\n key: string,\n spec: WorkerJobSpec\n): FluidWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"fluid\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"fluid\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive fluid profile that preserves stable snapshot coupling while scaling distant surface cost before near-field continuity.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.spectrum\",\n \"fluid.surface.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"fluid.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.snapshot\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"spectrum-advance\": Object.freeze({\n label: \"fluid.spectrum-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.spectrum\"]),\n levels: {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"boundary-coupling\": Object.freeze({\n label: \"fluid.boundary-coupling\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.boundary\"]),\n levels: {\n low: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"surface-solve\": Object.freeze({\n label: \"fluid.surface-solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"boundary-coupling\", \"spectrum-advance\"]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.surface.solve\"]),\n levels: {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 2.1,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"near-surface\": Object.freeze({\n label: \"fluid.near-surface\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.near\"]),\n levels: {\n low: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 2.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"mid-surface\": Object.freeze({\n label: \"fluid.mid-surface\",\n queueClass: \"render\",\n priority: 330,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.mid\"]),\n levels: {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 1.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.9,\n maxQueueDepth: 128,\n },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"fluid.far-proxy\",\n queueClass: \"render\",\n priority: 220,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.far\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.4,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 4,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 3,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n },\n }),\n \"horizon-shell\": Object.freeze({\n label: \"fluid.horizon-shell\",\n queueClass: \"render\",\n priority: 120,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.horizon\"]),\n levels: {\n low: {\n estimatedCostMs: 0.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 10,\n workgroupScale: 0.25,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.18,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 8,\n workgroupScale: 0.35,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.28,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n },\n }),\n \"foam-history\": Object.freeze({\n label: \"fluid.foam-history\",\n queueClass: \"render\",\n priority: 310,\n dependencies: Object.freeze([\"near-surface\", \"mid-surface\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n shading: 0.6,\n updateCadence: 0.6,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.foam\"]),\n levels: {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 1,\n workgroupScale: 0.85,\n maxQueueDepth: 96,\n },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic fluid profile that spends more budget on near and mid-field continuity before degrading distant fluid work.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.surface.near\",\n \"fluid.surface.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-surface\" || key === \"mid-surface\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: {\n ...spec.levels.low,\n estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)),\n },\n medium: {\n ...spec.levels.medium,\n estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)),\n },\n high: {\n ...spec.levels.high,\n estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)),\n },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst fluidWorkerProfileSpecs: Readonly<Record<FluidProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n [\n createSimulationStage({\n id: \"snapshot-ingest\",\n label: simulationStageLabels[\"snapshot-ingest\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"physics-snapshot\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"spectrum-advance\",\n label: simulationStageLabels[\"spectrum-advance\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"wave-spectrum\",\n snapshotStable: false,\n }),\n createSimulationStage({\n id: \"boundary-coupling\",\n label: simulationStageLabels[\"boundary-coupling\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"snapshot-ingest\"],\n output: \"boundary-constraints\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"surface-solve\",\n label: simulationStageLabels[\"surface-solve\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"boundary-coupling\", \"spectrum-advance\"],\n output: \"surface-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"near-surface\",\n label: simulationStageLabels[\"near-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"near-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"mid-surface\",\n label: simulationStageLabels[\"mid-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"mid-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"far-proxy\",\n label: simulationStageLabels[\"far-proxy\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"far-proxy-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"horizon-shell\",\n label: simulationStageLabels[\"horizon-shell\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"horizon-shell-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"foam-history\",\n label: simulationStageLabels[\"foam-history\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"near-surface\", \"mid-surface\"],\n output: \"foam-history-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"render-snapshot\",\n label: simulationStageLabels[\"render-snapshot\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n ],\n output: \"fluid-render-snapshot\",\n snapshotStable: true,\n }),\n ]\n);\n\nconst cinematicSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-shell\"\n ? Object.freeze({\n ...stage,\n output: stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-shell-representation-cinematic\",\n })\n : stage\n )\n);\n\nconst fluidSimulationPlanSpecs: Readonly<\n Record<FluidProfileName, readonly FluidSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected fluid profile.\n */\nexport function getFluidWorkerManifest(\n profile: FluidProfileName = defaultFluidProfile\n): FluidWorkerManifest {\n const profileName = normalizeFluidProfile(profile);\n const spec = fluidWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level fluid simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createFluidSimulationPlan(\n profile: FluidProfileName = defaultFluidProfile\n): FluidSimulationPlan {\n const profileName = normalizeFluidProfile(profile);\n const stages = fluidSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n description: fluidWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-spectrum\",\n requiresSharedWaveField: true,\n bands: fluidRepresentationBands,\n }),\n stages,\n });\n}\n","const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\nexport const lightingDistanceBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nconst lightingImportanceLevels = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\nconst lightingBandPolicySpecs = Object.freeze({\n near: Object.freeze({\n primaryShadowSource: \"ray-traced-primary\",\n assistShadowSources: Object.freeze([\"visibility-raster\", \"shadow-map-assist\"]),\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n mid: Object.freeze({\n primaryShadowSource: \"selective-raster-and-proxy\",\n assistShadowSources: Object.freeze([\n \"regional-shadow-map\",\n \"proxy-caster\",\n \"temporal-history\",\n ]),\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n far: Object.freeze({\n primaryShadowSource: \"merged-proxy-casters\",\n assistShadowSources: Object.freeze([\n \"coarse-directional\",\n \"semi-static-occlusion\",\n ]),\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n liveObjectShadows: false,\n impressionOnly: false,\n }),\n horizon: Object.freeze({\n primaryShadowSource: \"baked-impression\",\n assistShadowSources: Object.freeze([\"atmospheric-gradient\", \"skyline-darkening\"]),\n temporalReuse: \"baked\",\n updateCadenceDivisor: 60,\n liveObjectShadows: false,\n impressionOnly: true,\n }),\n});\n\nfunction assertLightingImportance(name, value) {\n if (!lightingImportanceLevels.includes(value)) {\n throw new Error(\n `${name} must be one of: ${lightingImportanceLevels.join(\", \")}.`\n );\n }\n return value;\n}\n\nfunction resolveBandParticipation(profileName, band, importance) {\n const referenceProfile = profileName === \"reference\";\n const premiumImportance =\n importance === \"critical\" || importance === \"high\";\n\n if (band === \"near\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"premium\" : \"selective\",\n reflections: premiumImportance ? \"premium\" : \"selective\",\n globalIllumination:\n referenceProfile || importance === \"critical\" ? \"premium\" : \"selective\",\n });\n }\n\n if (band === \"mid\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"selective\" : \"proxy\",\n reflections:\n referenceProfile && premiumImportance ? \"selective\" : \"proxy\",\n globalIllumination:\n referenceProfile && importance === \"critical\" ? \"selective\" : \"disabled\",\n });\n }\n\n if (band === \"far\") {\n return Object.freeze({\n directShadows: \"proxy\",\n reflections:\n referenceProfile && importance === \"critical\" ? \"proxy\" : \"disabled\",\n globalIllumination: \"disabled\",\n });\n }\n\n return Object.freeze({\n directShadows: \"disabled\",\n reflections: \"disabled\",\n globalIllumination: \"disabled\",\n });\n}\n\nexport function createLightingBandPlan(options = {}) {\n const profileName = options.profile ?? defaultLightingProfile;\n const profile = getLightingProfile(profileName);\n const importance = assertLightingImportance(\n \"importance\",\n options.importance ?? \"high\"\n );\n\n const bands = Object.freeze(\n lightingDistanceBands.map((band) =>\n Object.freeze({\n band,\n profile: profile.name,\n importance,\n primaryShadowSource: lightingBandPolicySpecs[band].primaryShadowSource,\n assistShadowSources: Object.freeze([\n ...lightingBandPolicySpecs[band].assistShadowSources,\n ]),\n rtParticipation: resolveBandParticipation(profile.name, band, importance),\n temporalReuse: lightingBandPolicySpecs[band].temporalReuse,\n updateCadenceDivisor: lightingBandPolicySpecs[band].updateCadenceDivisor,\n liveObjectShadows: lightingBandPolicySpecs[band].liveObjectShadows,\n impressionOnly: lightingBandPolicySpecs[band].impressionOnly,\n })\n )\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n importance,\n techniques: Object.freeze([...profile.techniques]),\n bands,\n });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction resolveLightingQualityDimensions(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { shadows: 1, lightingSamples: 0.7 },\n \"hybrid.screenTrace\": { rayTracing: 1, temporalReuse: 0.4 },\n \"hybrid.radianceCache\": {\n lightingSamples: 0.8,\n updateCadence: 0.7,\n temporalReuse: 1,\n },\n \"hybrid.finalGather\": { lightingSamples: 1, rayTracing: 0.6 },\n \"hybrid.reflectionResolve\": {\n rayTracing: 0.5,\n temporalReuse: 1,\n shading: 0.3,\n },\n \"pathtracer.pathTrace\": { rayTracing: 1, lightingSamples: 1 },\n \"pathtracer.accumulate\": { temporalReuse: 1, updateCadence: 0.4 },\n \"pathtracer.denoise\": { temporalReuse: 1, shading: 0.4 },\n \"volumetrics.froxelIntegrate\": {\n lightingSamples: 0.6,\n shading: 0.4,\n updateCadence: 0.3,\n },\n \"volumetrics.volumetricShadow\": { shadows: 0.8, updateCadence: 0.5 },\n \"hdri.irradianceConvolution\": {\n lightingSamples: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.specularPrefilter\": {\n lightingSamples: 0.5,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.brdfLut\": {\n shading: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n }[key] ?? {}\n );\n}\n\nfunction resolveLightingImportanceSignals(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { visible: true, shadowSignificance: \"high\" },\n \"hybrid.screenTrace\": { visible: true, reflectionSignificance: \"high\" },\n \"hybrid.radianceCache\": { visible: true },\n \"hybrid.finalGather\": {\n visible: true,\n shadowSignificance: \"critical\",\n reflectionSignificance: \"high\",\n },\n \"hybrid.reflectionResolve\": { visible: true, reflectionSignificance: \"high\" },\n \"pathtracer.pathTrace\": {\n visible: true,\n shadowSignificance: \"high\",\n reflectionSignificance: \"high\",\n },\n \"pathtracer.accumulate\": { visible: true },\n \"pathtracer.denoise\": { visible: true },\n \"volumetrics.froxelIntegrate\": { visible: true },\n \"volumetrics.volumetricShadow\": { visible: true, shadowSignificance: \"high\" },\n \"hdri.irradianceConvolution\": { visible: false },\n \"hdri.specularPrefilter\": { visible: false, reflectionSignificance: \"medium\" },\n \"hdri.brdfLut\": { visible: false },\n }[key] ?? {}\n );\n}\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n qualityDimensions: resolveLightingQualityDimensions(techniqueName, job.key),\n importanceSignals: resolveLightingImportanceSignals(techniqueName, job.key),\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n const lightingBandPlan = createLightingBandPlan({ profile: profile.name });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n lightingBands: lightingBandPlan.bands,\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n lightingBandPlan: createLightingBandPlan({ profile: profile.name }),\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n","import type {\n DeviceClass,\n GpuTier,\n ModuleAuthority,\n ModuleImportance,\n PerformanceDomain,\n RuntimeMode,\n ThermalState,\n WorkerJobQueueClass,\n WorkerSchedulerMode,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const runtimeModes = Object.freeze([\n \"flat\",\n \"immersive-vr\",\n \"immersive-ar\",\n]) satisfies readonly RuntimeMode[];\n\nexport const deviceClasses = Object.freeze([\n \"mobile\",\n \"tablet\",\n \"desktop\",\n \"xr-headset\",\n \"unknown\",\n]) satisfies readonly DeviceClass[];\n\nexport const gpuTiers = Object.freeze([\n \"low\",\n \"mid\",\n \"high\",\n \"ultra\",\n \"unknown\",\n]) satisfies readonly GpuTier[];\n\nexport const thermalStates = Object.freeze([\n \"nominal\",\n \"fair\",\n \"serious\",\n \"critical\",\n]) satisfies readonly ThermalState[];\n\nexport const performanceDomains = Object.freeze([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]) satisfies readonly PerformanceDomain[];\n\nexport const moduleAuthorities = Object.freeze([\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n]) satisfies readonly ModuleAuthority[];\n\nexport const moduleImportances = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]) satisfies readonly ModuleImportance[];\n\nexport const workerJobQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"custom\",\n]) satisfies readonly WorkerJobQueueClass[];\n\nexport const workerSchedulerModes = Object.freeze([\n \"flat\",\n \"dag\",\n]) satisfies readonly WorkerSchedulerMode[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Ensures a value is one of the allowed string literal members.\n */\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(\n `${name} must be one of: ${allowedValues.join(\", \")}.`\n );\n }\n\n return value as T;\n}\n\n/**\n * Validates numeric input that must be finite and greater than zero.\n */\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\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\n return value;\n}\n\n/**\n * Validates numeric input that must be finite and zero or greater.\n */\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\n/**\n * Validates bounded identifier strings used for module and frame ids.\n */\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\n/**\n * Validates that a value is a plain object and returns a shallow-frozen copy.\n */\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\n/**\n * Validates bounded arrays of positive numeric buckets.\n */\nexport function readFrameRateBuckets(\n name: string,\n value: unknown,\n maxEntries = 16\n): number[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of frame-rate numbers.`);\n }\n\n if (value.length > maxEntries) {\n throw new Error(`${name} cannot contain more than ${maxEntries} entries.`);\n }\n\n return value.map((entry, index) => {\n const parsed = readPositiveNumber(`${name}[${index}]`, entry);\n return Math.round(parsed ?? 0);\n });\n}\n\n/**\n * Best-effort validation for AbortSignal-like objects without depending on a specific runtime implementation.\n */\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n","import type {\n DeviceProfile,\n DeviceProfileInput,\n FrameTargetNegotiationOptions,\n FrameTargetProfile,\n RuntimeMode,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n deviceClasses,\n gpuTiers,\n normalizePlainObject,\n readFrameRateBuckets,\n readPositiveNumber,\n runtimeModes,\n thermalStates,\n} from \"./validation.js\";\n\nconst DEFAULT_FRAME_RATE_BUCKETS = Object.freeze([120, 90, 72, 60, 45, 36, 30]);\n\nfunction uniqueSortedFrameRates(values: readonly number[]): number[] {\n if (values.length === 0) {\n return [];\n }\n\n return [...new Set(values.map((value) => Math.round(value)))].sort(\n (left, right) => right - left\n );\n}\n\nfunction defaultModeForDevice(deviceClass: DeviceProfileInput[\"deviceClass\"]): RuntimeMode {\n return deviceClass === \"xr-headset\" ? \"immersive-vr\" : \"flat\";\n}\n\n/**\n * Normalizes the caller-supplied device profile into a deterministic runtime profile.\n */\nexport function createDeviceProfile(input: DeviceProfileInput = {}): DeviceProfile {\n const deviceClass =\n input.deviceClass === undefined\n ? \"unknown\"\n : assertEnumValue(\"deviceClass\", input.deviceClass, deviceClasses);\n const mode =\n input.mode === undefined\n ? defaultModeForDevice(deviceClass)\n : assertEnumValue(\"mode\", input.mode, runtimeModes);\n const defaultRefreshRateHz = mode === \"flat\" ? 60 : 72;\n const refreshRateHz =\n readPositiveNumber(\"refreshRateHz\", input.refreshRateHz) ?? defaultRefreshRateHz;\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", input.supportedFrameRates)\n );\n const metadata = normalizePlainObject(\"metadata\", input.metadata);\n\n return Object.freeze({\n deviceClass,\n mode,\n refreshRateHz,\n supportedFrameRates: Object.freeze(\n supportedFrameRates.length > 0 ? supportedFrameRates : [refreshRateHz]\n ),\n gpuTier:\n input.gpuTier === undefined\n ? \"unknown\"\n : assertEnumValue(\"gpuTier\", input.gpuTier, gpuTiers),\n supportsWebGpu: input.supportsWebGpu ?? true,\n supportsFoveation: input.supportsFoveation ?? false,\n thermalState:\n input.thermalState === undefined\n ? \"nominal\"\n : assertEnumValue(\"thermalState\", input.thermalState, thermalStates),\n metadata,\n });\n}\n\n/**\n * Negotiates a device-specific frame target and guardrails for the adaptive governor.\n */\nexport function negotiateFrameTarget(\n options: FrameTargetNegotiationOptions = {}\n): FrameTargetProfile {\n const mode =\n options.mode === undefined\n ? \"flat\"\n : assertEnumValue(\"mode\", options.mode, runtimeModes);\n const minimumFrameRate = Math.round(\n readPositiveNumber(\"minimumFrameRate\", options.minimumFrameRate) ?? 60\n );\n const maximumFrameRate = readPositiveNumber(\n \"maximumFrameRate\",\n options.maximumFrameRate\n );\n const deviceRefreshRateHz = readPositiveNumber(\n \"deviceRefreshRateHz\",\n options.deviceRefreshRateHz\n );\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", options.supportedFrameRates)\n );\n const preferredFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"preferredFrameRates\", options.preferredFrameRates)\n );\n\n if (maximumFrameRate !== undefined && maximumFrameRate < minimumFrameRate) {\n throw new Error(\"maximumFrameRate must be greater than or equal to minimumFrameRate.\");\n }\n\n const rationale: string[] = [];\n\n const candidateFrameRates = uniqueSortedFrameRates([\n ...preferredFrameRates,\n ...supportedFrameRates,\n ...DEFAULT_FRAME_RATE_BUCKETS,\n ]).filter((rate) => {\n if (maximumFrameRate && rate > maximumFrameRate) {\n return false;\n }\n\n if (deviceRefreshRateHz && rate > deviceRefreshRateHz) {\n return false;\n }\n\n return true;\n });\n\n let targetFrameRate =\n candidateFrameRates.find((rate) => rate >= minimumFrameRate) ??\n candidateFrameRates[0] ??\n deviceRefreshRateHz ??\n minimumFrameRate;\n\n if (\n mode !== \"flat\" &&\n deviceRefreshRateHz &&\n supportedFrameRates.includes(Math.round(deviceRefreshRateHz))\n ) {\n targetFrameRate = Math.round(deviceRefreshRateHz);\n rationale.push(\n `Using native ${targetFrameRate} Hz immersive session target supported by the device.`\n );\n } else if (targetFrameRate >= minimumFrameRate) {\n rationale.push(\n `Selected ${targetFrameRate} FPS from the negotiated device frame-rate bucket set.`\n );\n } else {\n rationale.push(\n `Device could not meet the requested ${minimumFrameRate} FPS floor, falling back to ${targetFrameRate} FPS.`\n );\n }\n\n if (mode === \"flat\") {\n rationale.push(\"Flat mode keeps a 60 FPS floor by default and negotiates upward.\");\n } else {\n rationale.push(\"Immersive modes prefer headset-native cadence when the session supports it.\");\n }\n\n const targetFrameTimeMs = 1000 / targetFrameRate;\n const downgradeMultiplier = mode === \"flat\" ? 1.05 : 1.03;\n const upgradeMultiplier = mode === \"flat\" ? 0.92 : 0.95;\n\n return Object.freeze({\n mode,\n minimumFrameRate,\n targetFrameRate,\n targetFrameTimeMs,\n downgradeFrameTimeMs: targetFrameTimeMs * downgradeMultiplier,\n upgradeFrameTimeMs: targetFrameTimeMs * upgradeMultiplier,\n candidateFrameRates: Object.freeze(candidateFrameRates),\n rationale: Object.freeze(rationale),\n });\n}\n","import type {\n MotionClass,\n PerformanceBudgetMetadata,\n PerformanceImportanceSignals,\n PerformanceQualityDimensions,\n QualityDimension,\n RepresentationBand,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n moduleImportances,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nexport const representationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]) satisfies readonly RepresentationBand[];\n\nexport const rayTracingQualityDimensions = Object.freeze([\n \"geometry\",\n \"animation\",\n \"deformation\",\n \"shading\",\n \"shadows\",\n \"rayTracing\",\n \"lightingSamples\",\n \"updateCadence\",\n \"temporalReuse\",\n]) satisfies readonly QualityDimension[];\n\nexport const motionClasses = Object.freeze([\n \"stable\",\n \"dynamic\",\n \"volatile\",\n]) satisfies readonly MotionClass[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeQualityDimensions(\n name: string,\n value: unknown\n): PerformanceQualityDimensions {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized = Object.fromEntries(\n Object.entries(value).flatMap(([key, rawValue]) => {\n const dimension = assertEnumValue(\n `${name}.${key}`,\n key,\n rayTracingQualityDimensions\n );\n const weight = readNonNegativeNumber(`${name}.${key}`, rawValue) ?? 0;\n return weight > 0 ? [[dimension, weight]] : [];\n })\n );\n\n return Object.freeze(normalized);\n}\n\nfunction normalizeImportanceSignals(\n name: string,\n value: unknown\n): Readonly<PerformanceImportanceSignals> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized: PerformanceImportanceSignals = {};\n\n if (value.visible !== undefined) {\n if (typeof value.visible !== \"boolean\") {\n throw new Error(`${name}.visible must be a boolean when provided.`);\n }\n normalized.visible = value.visible;\n }\n\n if (value.playerRelevant !== undefined) {\n if (typeof value.playerRelevant !== \"boolean\") {\n throw new Error(`${name}.playerRelevant must be a boolean when provided.`);\n }\n normalized.playerRelevant = value.playerRelevant;\n }\n\n if (value.imageCritical !== undefined) {\n if (typeof value.imageCritical !== \"boolean\") {\n throw new Error(`${name}.imageCritical must be a boolean when provided.`);\n }\n normalized.imageCritical = value.imageCritical;\n }\n\n if (value.motionClass !== undefined) {\n normalized.motionClass = assertEnumValue(\n `${name}.motionClass`,\n value.motionClass,\n motionClasses\n );\n }\n\n if (value.shadowSignificance !== undefined) {\n normalized.shadowSignificance = assertEnumValue(\n `${name}.shadowSignificance`,\n value.shadowSignificance,\n moduleImportances\n );\n }\n\n if (value.reflectionSignificance !== undefined) {\n normalized.reflectionSignificance = assertEnumValue(\n `${name}.reflectionSignificance`,\n value.reflectionSignificance,\n moduleImportances\n );\n }\n\n return Object.freeze(normalized);\n}\n\nexport function normalizePerformanceBudgetMetadata(\n name: string,\n value: unknown\n): Required<Omit<PerformanceBudgetMetadata, \"representationBand\">> &\n Pick<PerformanceBudgetMetadata, \"representationBand\"> {\n const source = isPlainObject(value) ? value : {};\n const representationBand =\n source.representationBand === undefined\n ? undefined\n : assertEnumValue(\n `${name}.representationBand`,\n source.representationBand,\n representationBands\n );\n\n return Object.freeze({\n representationBand,\n qualityDimensions: normalizeQualityDimensions(\n `${name}.qualityDimensions`,\n source.qualityDimensions\n ),\n importanceSignals: normalizeImportanceSignals(\n `${name}.importanceSignals`,\n source.importanceSignals\n ),\n });\n}\n","import { createDeviceProfile, negotiateFrameTarget } from \"./device.js\";\nimport type {\n FrameSample,\n GovernorAdaptationOptions,\n GovernorDecision,\n GovernorErrorRecord,\n GovernorMetrics,\n GovernorState,\n GovernorWorkerGraphSummary,\n GpuPerformanceGovernorOptions,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceGovernor,\n PerformanceModuleAdapter,\n PerformanceModuleSnapshot,\n PressureLevel,\n ThermalState,\n} from \"./types.js\";\nimport {\n assertIdentifier,\n isAbortSignalLike,\n performanceDomains,\n readNonNegativeNumber,\n readPositiveNumber,\n thermalStates,\n} from \"./validation.js\";\n\nconst MAX_MODULE_COUNT = 128;\nconst MAX_SAMPLE_WINDOW_SIZE = 240;\n\nexport const defaultDomainOrder = Object.freeze<readonly PerformanceDomain[]>([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]);\n\nconst DEFAULT_ADAPTATION_OPTIONS = Object.freeze<Required<GovernorAdaptationOptions>>({\n sampleWindowSize: 24,\n minimumSamplesBeforeAdjustment: 8,\n degradeCooldownFrames: 6,\n upgradeCooldownFrames: 24,\n minStableFramesForRecovery: 10,\n trendSensitivityMs: 0.35,\n emaAlpha: 0.25,\n maxStepChangesPerCycle: 2,\n allowAuthoritativeScaling: false,\n domainOrder: defaultDomainOrder,\n maxRetainedErrors: 50,\n maxRetainedFrameIds: 512,\n});\n\nfunction clampPositiveInteger(\n value: number | undefined,\n fallback: number,\n maximum?: number\n): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n const rounded = Math.round(value);\n return maximum ? Math.min(rounded, maximum) : rounded;\n}\n\nfunction clampRatio(value: number | undefined, fallback: number): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value <= 0 ||\n value >= 1\n ) {\n return fallback;\n }\n\n return value;\n}\n\nfunction buildAdaptationOptions(\n options: GovernorAdaptationOptions | undefined\n): Required<GovernorAdaptationOptions> {\n const domainOrder =\n options?.domainOrder?.length && options.domainOrder.length <= performanceDomains.length\n ? [...new Set(options.domainOrder)]\n : DEFAULT_ADAPTATION_OPTIONS.domainOrder;\n\n return {\n sampleWindowSize: clampPositiveInteger(\n options?.sampleWindowSize,\n DEFAULT_ADAPTATION_OPTIONS.sampleWindowSize,\n MAX_SAMPLE_WINDOW_SIZE\n ),\n minimumSamplesBeforeAdjustment: clampPositiveInteger(\n options?.minimumSamplesBeforeAdjustment,\n DEFAULT_ADAPTATION_OPTIONS.minimumSamplesBeforeAdjustment\n ),\n degradeCooldownFrames: clampPositiveInteger(\n options?.degradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.degradeCooldownFrames\n ),\n upgradeCooldownFrames: clampPositiveInteger(\n options?.upgradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.upgradeCooldownFrames\n ),\n minStableFramesForRecovery: clampPositiveInteger(\n options?.minStableFramesForRecovery,\n DEFAULT_ADAPTATION_OPTIONS.minStableFramesForRecovery\n ),\n trendSensitivityMs:\n typeof options?.trendSensitivityMs === \"number\" &&\n Number.isFinite(options.trendSensitivityMs) &&\n options.trendSensitivityMs > 0\n ? options.trendSensitivityMs\n : DEFAULT_ADAPTATION_OPTIONS.trendSensitivityMs,\n emaAlpha: clampRatio(options?.emaAlpha, DEFAULT_ADAPTATION_OPTIONS.emaAlpha),\n maxStepChangesPerCycle: clampPositiveInteger(\n options?.maxStepChangesPerCycle,\n DEFAULT_ADAPTATION_OPTIONS.maxStepChangesPerCycle\n ),\n allowAuthoritativeScaling:\n options?.allowAuthoritativeScaling ??\n DEFAULT_ADAPTATION_OPTIONS.allowAuthoritativeScaling,\n domainOrder,\n maxRetainedErrors: clampPositiveInteger(\n options?.maxRetainedErrors,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedErrors\n ),\n maxRetainedFrameIds: clampPositiveInteger(\n options?.maxRetainedFrameIds,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedFrameIds\n ),\n };\n}\n\nfunction averageOf(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction percentile(values: readonly number[], ratio: number): number {\n if (values.length === 0) {\n return 0;\n }\n\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(\n sorted.length - 1,\n Math.max(0, Math.ceil(sorted.length * ratio) - 1)\n );\n\n return sorted[index] ?? 0;\n}\n\nfunction averageFrameMetric(\n samples: readonly FrameSample[],\n key: \"cpuTimeMs\" | \"gpuTimeMs\"\n) {\n const values = samples\n .map((sample) => sample[key])\n .filter((value): value is number => typeof value === \"number\");\n\n return averageOf(values);\n}\n\nfunction computeTrendDelta(samples: readonly FrameSample[]): number {\n if (samples.length < 4) {\n return 0;\n }\n\n const midpoint = Math.floor(samples.length / 2);\n const older = samples.slice(0, midpoint).map((sample) => sample.frameTimeMs);\n const newer = samples.slice(midpoint).map((sample) => sample.frameTimeMs);\n const olderAverage = averageOf(older) ?? 0;\n const newerAverage = averageOf(newer) ?? 0;\n return newerAverage - olderAverage;\n}\n\nfunction createMetrics(\n samples: readonly FrameSample[],\n emaFrameTimeMs: number,\n targetFrameTimeMs: number,\n thermalState: ThermalState\n): GovernorMetrics {\n const frameTimes = samples.map((sample) => sample.frameTimeMs);\n const latestFrameTimeMs = frameTimes[frameTimes.length - 1] ?? targetFrameTimeMs;\n const averageFrameTimeMs = averageOf(frameTimes) ?? targetFrameTimeMs;\n const fps = averageFrameTimeMs > 0 ? 1000 / averageFrameTimeMs : 0;\n const p95FrameTimeMs = percentile(frameTimes, 0.95);\n const dropRatio =\n samples.filter(\n (sample) =>\n sample.dropped === true || sample.frameTimeMs > targetFrameTimeMs * 1.1\n ).length / Math.max(1, samples.length);\n\n return {\n sampleCount: samples.length,\n fps,\n latestFrameTimeMs,\n averageFrameTimeMs,\n emaFrameTimeMs,\n p95FrameTimeMs,\n averageCpuTimeMs: averageFrameMetric(samples, \"cpuTimeMs\"),\n averageGpuTimeMs: averageFrameMetric(samples, \"gpuTimeMs\"),\n targetFrameTimeMs,\n frameTimeDeltaMs: averageFrameTimeMs - targetFrameTimeMs,\n trendDeltaMs: computeTrendDelta(samples),\n dropRatio,\n thermalState,\n };\n}\n\nfunction classifyPressure(\n metrics: GovernorMetrics,\n downgradeFrameTimeMs: number,\n upgradeFrameTimeMs: number,\n trendSensitivityMs: number\n): PressureLevel {\n if (\n metrics.thermalState === \"critical\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.latestFrameTimeMs >= metrics.targetFrameTimeMs * 1.5 ||\n metrics.dropRatio >= 0.35\n ) {\n return \"starved\";\n }\n\n if (\n metrics.thermalState === \"serious\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.12 ||\n metrics.p95FrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.trendDeltaMs >= trendSensitivityMs * 1.5\n ) {\n return \"critical\";\n }\n\n if (\n metrics.thermalState === \"fair\" ||\n metrics.averageFrameTimeMs >= downgradeFrameTimeMs ||\n metrics.trendDeltaMs >= trendSensitivityMs ||\n metrics.dropRatio >= 0.1\n ) {\n return \"elevated\";\n }\n\n if (\n metrics.averageFrameTimeMs <= upgradeFrameTimeMs &&\n metrics.trendDeltaMs <= 0 &&\n metrics.dropRatio <= 0.05\n ) {\n return \"recovering\";\n }\n\n return \"stable\";\n}\n\nfunction domainRank(\n domain: PerformanceDomain,\n domainOrder: readonly PerformanceDomain[]\n): number {\n const index = domainOrder.indexOf(domain);\n return index >= 0 ? index : domainOrder.length + 1;\n}\n\ntype WorkerDagSnapshot = PerformanceModuleSnapshot & {\n priority: number;\n dependencies: readonly string[];\n dependents: readonly string[];\n dependencyCount: number;\n unresolvedDependencyCount: number;\n dependentCount: number;\n root: boolean;\n schedulerMode: \"flat\" | \"dag\";\n};\n\nfunction toWorkerDagSnapshot(\n snapshot: PerformanceModuleSnapshot\n): WorkerDagSnapshot | null {\n if (\n typeof (snapshot as { priority?: unknown }).priority !== \"number\" ||\n !Array.isArray((snapshot as { dependencies?: unknown }).dependencies) ||\n !Array.isArray((snapshot as { dependents?: unknown }).dependents) ||\n typeof (snapshot as { dependencyCount?: unknown }).dependencyCount !== \"number\" ||\n typeof (snapshot as { unresolvedDependencyCount?: unknown }).unresolvedDependencyCount !==\n \"number\" ||\n typeof (snapshot as { dependentCount?: unknown }).dependentCount !== \"number\" ||\n typeof (snapshot as { root?: unknown }).root !== \"boolean\" ||\n ((snapshot as { schedulerMode?: unknown }).schedulerMode !== \"flat\" &&\n (snapshot as { schedulerMode?: unknown }).schedulerMode !== \"dag\")\n ) {\n return null;\n }\n\n return snapshot as WorkerDagSnapshot;\n}\n\nconst representationBandProtectionScores = Object.freeze({\n near: 140,\n mid: 80,\n far: 20,\n horizon: 0,\n});\n\nconst motionProtectionScores = Object.freeze({\n stable: 0,\n dynamic: 12,\n volatile: 24,\n});\n\nconst dimensionBiasScores = Object.freeze({\n geometry: 22,\n animation: 16,\n deformation: 20,\n shading: 10,\n shadows: 8,\n rayTracing: 4,\n lightingSamples: -8,\n updateCadence: -24,\n temporalReuse: -20,\n});\n\nfunction importanceWeight(value: string | undefined): number {\n return value === \"critical\"\n ? 20\n : value === \"high\"\n ? 12\n : value === \"medium\"\n ? 6\n : 0;\n}\n\nfunction rankBudgetMetadata(snapshot: PerformanceModuleSnapshot): number {\n const representationBand =\n snapshot.representationBand &&\n snapshot.representationBand in representationBandProtectionScores\n ? snapshot.representationBand\n : undefined;\n const qualityDimensions =\n snapshot.qualityDimensions && typeof snapshot.qualityDimensions === \"object\"\n ? snapshot.qualityDimensions\n : {};\n const importanceSignals =\n snapshot.importanceSignals && typeof snapshot.importanceSignals === \"object\"\n ? snapshot.importanceSignals\n : {};\n\n const bandScore = representationBand\n ? representationBandProtectionScores[representationBand]\n : 0;\n const visibilityScore =\n (importanceSignals.visible ? 26 : 0) +\n (importanceSignals.playerRelevant ? 24 : 0) +\n (importanceSignals.imageCritical ? 18 : 0);\n const motionScore =\n importanceSignals.motionClass &&\n importanceSignals.motionClass in motionProtectionScores\n ? motionProtectionScores[importanceSignals.motionClass]\n : 0;\n const significanceScore =\n importanceWeight(importanceSignals.shadowSignificance) +\n importanceWeight(importanceSignals.reflectionSignificance);\n const dimensionScore = Object.entries(qualityDimensions).reduce(\n (total, [dimension, weight]) =>\n total +\n ((dimensionBiasScores as Record<string, number>)[dimension] ?? 0) *\n (typeof weight === \"number\" ? weight : 0),\n 0\n );\n\n return bandScore + visibilityScore + motionScore + significanceScore + dimensionScore;\n}\n\nfunction buildWorkerGraphSummary(\n snapshots: readonly PerformanceModuleSnapshot[]\n): GovernorWorkerGraphSummary | null {\n const dagSnapshots = snapshots\n .map((snapshot) => toWorkerDagSnapshot(snapshot))\n .filter((snapshot): snapshot is WorkerDagSnapshot => snapshot?.schedulerMode === \"dag\");\n\n if (dagSnapshots.length === 0) {\n return null;\n }\n\n const lanes = new Map<number, { priority: number; jobCount: number; rootCount: number; protectedJobCount: number }>();\n const roots: string[] = [];\n let protectedJobCount = 0;\n let maxPriority = 0;\n let maxDependentCount = 0;\n\n for (const snapshot of dagSnapshots) {\n if (snapshot.root) {\n roots.push(snapshot.id);\n }\n\n const isProtected =\n snapshot.authority === \"authoritative\" ||\n snapshot.root ||\n snapshot.priority > 0 ||\n snapshot.dependentCount > 0;\n if (isProtected) {\n protectedJobCount += 1;\n }\n\n maxPriority = Math.max(maxPriority, snapshot.priority);\n maxDependentCount = Math.max(maxDependentCount, snapshot.dependentCount);\n\n const lane = lanes.get(snapshot.priority) ?? {\n priority: snapshot.priority,\n jobCount: 0,\n rootCount: 0,\n protectedJobCount: 0,\n };\n lane.jobCount += 1;\n if (snapshot.root) {\n lane.rootCount += 1;\n }\n if (isProtected) {\n lane.protectedJobCount += 1;\n }\n lanes.set(snapshot.priority, lane);\n }\n\n return Object.freeze({\n schedulerMode: \"dag\",\n jobCount: dagSnapshots.length,\n rootCount: roots.length,\n protectedJobCount,\n degradableJobCount: dagSnapshots.length - protectedJobCount,\n maxPriority,\n maxDependentCount,\n roots: Object.freeze([...roots]),\n priorityLanes: Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobCount: lane.jobCount,\n rootCount: lane.rootCount,\n protectedJobCount: lane.protectedJobCount,\n })\n )\n ),\n });\n}\n\nfunction rankForDegrade(\n snapshot: PerformanceModuleSnapshot,\n domainOrder: readonly PerformanceDomain[],\n allowAuthoritativeScaling: boolean\n): number {\n if (snapshot.authority === \"authoritative\" && !allowAuthoritativeScaling) {\n return Number.POSITIVE_INFINITY;\n }\n\n const authorityScore =\n snapshot.authority === \"visual\"\n ? 0\n : snapshot.authority === \"non-authoritative-simulation\"\n ? 100\n : 300;\n const importanceScore =\n snapshot.importance === \"low\"\n ? 0\n : snapshot.importance === \"medium\"\n ? 20\n : snapshot.importance === \"high\"\n ? 40\n : 60;\n const costScore = -(snapshot.estimatedCostMs ?? 0);\n const workerDag = toWorkerDagSnapshot(snapshot);\n const dagProtectionScore =\n workerDag?.schedulerMode === \"dag\"\n ? (workerDag.root ? 120 : 0) +\n workerDag.priority * 25 +\n workerDag.dependentCount * 18\n : 0;\n const budgetMetadataScore = rankBudgetMetadata(snapshot);\n\n return (\n authorityScore +\n importanceScore +\n domainRank(snapshot.domain, domainOrder) * 10 +\n costScore +\n dagProtectionScore +\n budgetMetadataScore\n );\n}\n\nfunction buildReason(\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n): string {\n const average = metrics.averageFrameTimeMs.toFixed(2);\n const target = metrics.targetFrameTimeMs.toFixed(2);\n const trend = metrics.trendDeltaMs.toFixed(2);\n const graphNote =\n workerGraph && workerGraph.schedulerMode === \"dag\"\n ? ` DAG roots ${workerGraph.rootCount}/${workerGraph.jobCount}, max priority ${workerGraph.maxPriority}, max fan-out ${workerGraph.maxDependentCount}.`\n : \"\";\n return `${pressureLevel} pressure: avg ${average} ms vs target ${target} ms, trend delta ${trend} ms.${graphNote}`;\n}\n\nfunction sanitizeErrorMessage(error: unknown): string {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"Unexpected runtime failure.\";\n\n return message.replace(/\\s+/gu, \" \").trim().slice(0, 160) || \"Unexpected runtime failure.\";\n}\n\nfunction validateTelemetryHooks(\n telemetry: GpuPerformanceGovernorOptions[\"telemetry\"]\n): void {\n if (!telemetry) {\n return;\n }\n\n for (const [name, hook] of Object.entries(telemetry)) {\n if (hook !== undefined && typeof hook !== \"function\") {\n throw new Error(`telemetry.${name} must be a function when provided.`);\n }\n }\n}\n\nfunction validateFrameSample(sample: FrameSample): void {\n readPositiveNumber(\"frameTimeMs\", sample.frameTimeMs);\n readNonNegativeNumber(\"cpuTimeMs\", sample.cpuTimeMs);\n readNonNegativeNumber(\"gpuTimeMs\", sample.gpuTimeMs);\n readNonNegativeNumber(\"timestampMs\", sample.timestampMs);\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"dropped must be a boolean when provided.\");\n }\n\n if (sample.thermalState !== undefined && !thermalStates.includes(sample.thermalState)) {\n throw new Error(`thermalState must be one of: ${thermalStates.join(\", \")}.`);\n }\n\n if (sample.frameId !== undefined) {\n assertIdentifier(\"frameId\", sample.frameId);\n }\n\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"signal must be an AbortSignal-like object when provided.\");\n }\n}\n\nfunction validateModuleAdapter(module: PerformanceModuleAdapter): void {\n if (!module || typeof module !== \"object\") {\n throw new Error(\"modules entries must be objects that implement the adapter contract.\");\n }\n\n assertIdentifier(\"module.id\", module.id);\n\n if (typeof module.getSnapshot !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement getSnapshot().`);\n }\n\n if (typeof module.stepDown !== \"function\" || typeof module.stepUp !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement stepDown() and stepUp().`);\n }\n}\n\nfunction createErrorRecord(input: {\n cycle: number;\n source: GovernorErrorRecord[\"source\"];\n code: string;\n message: string;\n retryable: boolean;\n moduleId?: string;\n correlationId?: string;\n}): GovernorErrorRecord {\n return Object.freeze({\n cycle: input.cycle,\n source: input.source,\n code: input.code,\n message: input.message,\n retryable: input.retryable,\n moduleId: input.moduleId,\n correlationId: input.correlationId,\n });\n}\n\n/**\n * Creates the local closed-loop GPU performance governor.\n */\nexport function createGpuPerformanceGovernor(\n options: GpuPerformanceGovernorOptions\n): PerformanceGovernor {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"createGpuPerformanceGovernor requires an options object.\");\n }\n\n validateTelemetryHooks(options.telemetry);\n\n const device = createDeviceProfile(options.device);\n if (!device.supportsWebGpu) {\n throw new Error(\n \"WebGPU support is required to create the GPU performance governor.\"\n );\n }\n\n const adaptation = buildAdaptationOptions(options.adaptation);\n const target = negotiateFrameTarget({\n mode: options.target?.mode ?? device.mode,\n deviceRefreshRateHz: options.target?.deviceRefreshRateHz ?? device.refreshRateHz,\n supportedFrameRates:\n options.target?.supportedFrameRates ?? device.supportedFrameRates,\n preferredFrameRates: options.target?.preferredFrameRates,\n minimumFrameRate: options.target?.minimumFrameRate,\n maximumFrameRate: options.target?.maximumFrameRate,\n });\n\n const modules = new Map<string, PerformanceModuleAdapter>();\n if ((options.modules?.length ?? 0) > MAX_MODULE_COUNT) {\n throw new Error(`modules cannot contain more than ${MAX_MODULE_COUNT} adapters.`);\n }\n\n for (const module of options.modules ?? []) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Duplicate module id \"${module.id}\" detected.`);\n }\n modules.set(module.id, module);\n }\n\n let cycle = 0;\n let samples: FrameSample[] = [];\n let emaFrameTimeMs = target.targetFrameTimeMs;\n let lastThermalState = device.thermalState;\n let lastDecision: GovernorDecision | null = null;\n let stableRecoveryFrames = 0;\n let lastDownCycle = Number.NEGATIVE_INFINITY;\n let lastUpCycle = Number.NEGATIVE_INFINITY;\n let recoveryStack: string[] = [];\n let recentErrors: GovernorErrorRecord[] = [];\n let recentFrameIds = new Set<string>();\n let recentFrameIdQueue: string[] = [];\n\n const appendError = (error: GovernorErrorRecord, decisionErrors?: GovernorErrorRecord[]) => {\n if (decisionErrors) {\n decisionErrors.push(error);\n }\n\n recentErrors = [...recentErrors, error].slice(-adaptation.maxRetainedErrors);\n\n if (typeof options.telemetry?.onError === \"function\") {\n try {\n options.telemetry.onError(error);\n } catch {\n // Error reporting must never cause recursive runtime failure.\n }\n }\n };\n\n const emitTelemetry = <Payload>(\n hook: ((payload: Payload) => void) | undefined,\n payload: Payload,\n errorFactory: () => GovernorErrorRecord,\n decisionErrors?: GovernorErrorRecord[]\n ) => {\n if (typeof hook !== \"function\") {\n return;\n }\n\n try {\n hook(payload);\n } catch {\n appendError(errorFactory(), decisionErrors);\n }\n };\n\n emitTelemetry(\n options.telemetry?.onTargetNegotiated,\n target,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_TARGET_HOOK_FAILED\",\n message: \"Target-negotiated telemetry callback failed.\",\n retryable: true,\n })\n );\n\n const getModuleSnapshots = (): PerformanceModuleSnapshot[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return module.getSnapshot();\n } catch {\n return null;\n }\n })\n .filter((snapshot): snapshot is PerformanceModuleSnapshot => snapshot !== null);\n\n const createContext = (\n cause: \"degrade\" | \"recover\",\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n ): PerformanceAdjustmentContext => ({\n cycle,\n cause,\n pressureLevel,\n metrics,\n target,\n workerGraph,\n });\n\n const classifyCurrentPressure = (metrics: GovernorMetrics) =>\n classifyPressure(\n metrics,\n target.downgradeFrameTimeMs,\n target.upgradeFrameTimeMs,\n adaptation.trendSensitivityMs\n );\n\n const buildDecision = (\n processed: boolean,\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n adjustments: readonly PerformanceAdjustmentRecord[],\n errors: readonly GovernorErrorRecord[],\n reason: string\n ): GovernorDecision => ({\n cycle,\n processed,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n errors,\n reason,\n });\n\n const buildIgnoredDecision = (\n reason: string,\n errors: readonly GovernorErrorRecord[] = []\n ): GovernorDecision => {\n const metrics =\n lastDecision?.metrics ??\n createMetrics(samples, emaFrameTimeMs, target.targetFrameTimeMs, lastThermalState);\n const pressureLevel = lastDecision?.pressureLevel ?? classifyCurrentPressure(metrics);\n const workerGraph =\n lastDecision?.workerGraph ?? buildWorkerGraphSummary(getModuleSnapshots());\n\n return buildDecision(\n false,\n pressureLevel,\n metrics,\n workerGraph,\n [],\n errors,\n reason\n );\n };\n\n const rememberFrameId = (frameId: string): boolean => {\n if (recentFrameIds.has(frameId)) {\n return false;\n }\n\n recentFrameIds.add(frameId);\n recentFrameIdQueue.push(frameId);\n\n while (recentFrameIdQueue.length > adaptation.maxRetainedFrameIds) {\n const oldest = recentFrameIdQueue.shift();\n if (oldest) {\n recentFrameIds.delete(oldest);\n }\n }\n\n return true;\n };\n\n const selectDegradeCandidates = (\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceModuleAdapter[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return {\n module,\n snapshot: module.getSnapshot(),\n };\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_SNAPSHOT_FAILED\",\n message: `Module \"${module.id}\" snapshot failed and the module was skipped.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n return null;\n }\n })\n .filter(\n (\n candidate\n ): candidate is {\n module: PerformanceModuleAdapter;\n snapshot: PerformanceModuleSnapshot;\n } => candidate !== null\n )\n .sort((left, right) => {\n const leftRank = rankForDegrade(\n left.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n const rightRank = rankForDegrade(\n right.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n\n return leftRank - rightRank;\n })\n .map((candidate) => candidate.module);\n\n const attemptDowngrade = (\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const changesAllowed =\n pressureLevel === \"starved\"\n ? adaptation.maxStepChangesPerCycle\n : Math.min(\n adaptation.maxStepChangesPerCycle,\n pressureLevel === \"critical\" ? 2 : 1\n );\n const context = createContext(\"degrade\", pressureLevel, metrics, workerGraph);\n const adjustments: PerformanceAdjustmentRecord[] = [];\n\n for (const module of selectDegradeCandidates(decisionErrors, correlationId)) {\n if (adjustments.length >= changesAllowed) {\n break;\n }\n\n try {\n const adjustment = module.stepDown(context);\n if (!adjustment) {\n continue;\n }\n\n adjustments.push(adjustment);\n recoveryStack.push(module.id);\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_DOWN_FAILED\",\n message: `Module \"${module.id}\" could not be reduced during degrade handling.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return adjustments;\n };\n\n const attemptRecovery = (\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const context = createContext(\"recover\", \"recovering\", metrics, workerGraph);\n\n while (recoveryStack.length > 0) {\n const moduleId = recoveryStack[recoveryStack.length - 1];\n if (!moduleId) {\n recoveryStack.pop();\n continue;\n }\n\n const module = modules.get(moduleId);\n if (!module) {\n recoveryStack.pop();\n continue;\n }\n\n try {\n const adjustment = module.stepUp(context);\n recoveryStack.pop();\n\n if (adjustment) {\n return [adjustment];\n }\n } catch {\n recoveryStack.pop();\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_UP_FAILED\",\n message: `Module \"${moduleId}\" could not be restored during recovery handling.`,\n retryable: true,\n moduleId,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return [];\n };\n\n return {\n recordFrame(sample) {\n if (!sample || typeof sample !== \"object\") {\n throw new Error(\"recordFrame requires a frame sample object.\");\n }\n\n validateFrameSample(sample);\n\n if (sample.signal?.aborted) {\n return buildIgnoredDecision(\n \"Ignored frame sample because its AbortSignal was already aborted.\"\n );\n }\n\n if (sample.frameId && !rememberFrameId(sample.frameId)) {\n return buildIgnoredDecision(\n `Ignored duplicate frame sample \"${sample.frameId}\".`\n );\n }\n\n cycle += 1;\n const decisionErrors: GovernorErrorRecord[] = [];\n lastThermalState = sample.thermalState ?? lastThermalState;\n emaFrameTimeMs =\n cycle === 1\n ? sample.frameTimeMs\n : sample.frameTimeMs * adaptation.emaAlpha +\n emaFrameTimeMs * (1 - adaptation.emaAlpha);\n\n samples = [...samples, sample].slice(-adaptation.sampleWindowSize);\n\n const metrics = createMetrics(\n samples,\n emaFrameTimeMs,\n target.targetFrameTimeMs,\n lastThermalState\n );\n const workerGraph = buildWorkerGraphSummary(getModuleSnapshots());\n const pressureLevel = classifyCurrentPressure(metrics);\n\n if (pressureLevel === \"recovering\" || pressureLevel === \"stable\") {\n stableRecoveryFrames += 1;\n } else {\n stableRecoveryFrames = 0;\n }\n\n let adjustments: PerformanceAdjustmentRecord[] = [];\n const enoughSamples =\n metrics.sampleCount >= adaptation.minimumSamplesBeforeAdjustment;\n\n if (\n enoughSamples &&\n (pressureLevel === \"elevated\" ||\n pressureLevel === \"critical\" ||\n pressureLevel === \"starved\") &&\n (pressureLevel === \"starved\" ||\n cycle - lastDownCycle >= adaptation.degradeCooldownFrames)\n ) {\n adjustments = attemptDowngrade(\n pressureLevel,\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastDownCycle = cycle;\n stableRecoveryFrames = 0;\n }\n } else if (\n enoughSamples &&\n pressureLevel === \"recovering\" &&\n stableRecoveryFrames >= adaptation.minStableFramesForRecovery &&\n cycle - lastUpCycle >= adaptation.upgradeCooldownFrames\n ) {\n adjustments = attemptRecovery(\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastUpCycle = cycle;\n stableRecoveryFrames = 0;\n }\n }\n\n const decision = buildDecision(\n true,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n decisionErrors,\n buildReason(pressureLevel, metrics, workerGraph)\n );\n\n emitTelemetry(\n options.telemetry?.onDecision,\n decision,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_DECISION_HOOK_FAILED\",\n message: \"Decision telemetry callback failed.\",\n retryable: true,\n correlationId: sample.frameId,\n }),\n decisionErrors\n );\n\n const finalizedDecision =\n decisionErrors.length === 0\n ? decision\n : {\n ...decision,\n errors: [...decisionErrors],\n };\n\n lastDecision = finalizedDecision;\n return finalizedDecision;\n },\n registerModule(module) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Module \"${module.id}\" is already registered.`);\n }\n\n modules.set(module.id, module);\n\n return () => {\n modules.delete(module.id);\n recoveryStack = recoveryStack.filter((id) => id !== module.id);\n };\n },\n getTarget() {\n return target;\n },\n getState(): GovernorState {\n const moduleSnapshots = getModuleSnapshots();\n return {\n cycle,\n target,\n device,\n metrics: lastDecision?.metrics ?? null,\n modules: moduleSnapshots,\n workerGraph: buildWorkerGraphSummary(moduleSnapshots),\n lastDecision,\n recentErrors,\n };\n },\n reset() {\n cycle = 0;\n samples = [];\n emaFrameTimeMs = target.targetFrameTimeMs;\n lastThermalState = device.thermalState;\n lastDecision = null;\n stableRecoveryFrames = 0;\n lastDownCycle = Number.NEGATIVE_INFINITY;\n lastUpCycle = Number.NEGATIVE_INFINITY;\n recoveryStack = [];\n recentErrors = [];\n recentFrameIds = new Set();\n recentFrameIdQueue = [];\n },\n };\n}\n\n/**\n * Alias for createGpuPerformanceGovernor.\n */\nexport const createPerformanceGovernor = createGpuPerformanceGovernor;\n","import type {\n ModuleImportance,\n ModuleQualityLevel,\n ModuleAuthority,\n PerformanceBudgetMetadata,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceModuleSnapshot,\n QualityLadderAdapter,\n QualityLadderAdapterOptions,\n} from \"./types.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n moduleAuthorities,\n moduleImportances,\n performanceDomains,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nfunction resolveLevelIndex<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[],\n initialLevel: number | string | undefined\n): number {\n if (typeof initialLevel === \"number\") {\n if (initialLevel < 0 || initialLevel >= levels.length) {\n throw new Error(`Initial level index ${initialLevel} is out of range.`);\n }\n\n return initialLevel;\n }\n\n if (typeof initialLevel === \"string\") {\n const index = levels.findIndex((level) => level.id === initialLevel);\n if (index < 0) {\n throw new Error(`Initial level \"${initialLevel}\" does not exist in the ladder.`);\n }\n\n return index;\n }\n\n return levels.length - 1;\n}\n\nfunction assertUniqueLevelIds<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[]\n): void {\n const seen = new Set<string>();\n\n for (const level of levels) {\n assertIdentifier(\"levels[].id\", level.id);\n\n if (readNonNegativeNumber(`estimatedCostMs for level \"${level.id}\"`, level.estimatedCostMs) === undefined) {\n // no-op\n }\n\n if (seen.has(level.id)) {\n throw new Error(`Duplicate ladder level id \"${level.id}\" detected.`);\n }\n\n seen.add(level.id);\n }\n}\n\nfunction buildSnapshot<Payload>(\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n metadata: PerformanceBudgetMetadata,\n levels: readonly ModuleQualityLevel<Payload>[],\n currentLevelIndex: number\n): PerformanceModuleSnapshot<Payload> {\n const currentLevel = levels[currentLevelIndex]!;\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n currentLevelIndex,\n currentLevel,\n levelCount: levels.length,\n isAtMinimum: currentLevelIndex === 0,\n isAtMaximum: currentLevelIndex === levels.length - 1,\n estimatedCostMs: currentLevel.estimatedCostMs,\n };\n}\n\nfunction buildAdjustment<Payload>(\n direction: \"down\" | \"up\",\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n previousLevelIndex: number,\n nextLevelIndex: number,\n levels: readonly ModuleQualityLevel<Payload>[],\n context: PerformanceAdjustmentContext\n): PerformanceAdjustmentRecord<Payload> {\n const previousLevel = levels[previousLevelIndex]!;\n const nextLevel = levels[nextLevelIndex]!;\n\n return {\n moduleId: id,\n domain,\n authority,\n importance,\n direction,\n fromLevelIndex: previousLevelIndex,\n toLevelIndex: nextLevelIndex,\n fromLevelId: previousLevel.id,\n toLevelId: nextLevel.id,\n appliedConfig: nextLevel.config,\n reason:\n direction === \"down\"\n ? `Reduced ${id} while ${context.pressureLevel} pressure exceeded the negotiated frame budget.`\n : `Restored ${id} after sustained recovery under the negotiated frame budget.`,\n };\n}\n\n/**\n * Creates a ladder-backed module adapter ordered from lowest quality to highest quality.\n */\nexport function createQualityLadderAdapter<Payload>(\n options: QualityLadderAdapterOptions<Payload>\n): QualityLadderAdapter<Payload> {\n const id = assertIdentifier(\"adapter id\", options.id);\n\n if (!Array.isArray(options.levels) || options.levels.length === 0) {\n throw new Error(`Quality ladder adapter \"${id}\" requires at least one level.`);\n }\n\n if (options.levels.length > 64) {\n throw new Error(`Quality ladder adapter \"${id}\" cannot exceed 64 quality levels.`);\n }\n\n assertUniqueLevelIds(options.levels);\n\n const authority =\n options.authority === undefined\n ? \"visual\"\n : assertEnumValue(\"authority\", options.authority, moduleAuthorities);\n const importance =\n options.importance === undefined\n ? \"medium\"\n : assertEnumValue(\"importance\", options.importance, moduleImportances);\n const domain = assertEnumValue(\"domain\", options.domain, performanceDomains);\n const levels = [...options.levels];\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n let currentLevelIndex = resolveLevelIndex(levels, options.initialLevel);\n\n const emitChange = (\n context: PerformanceAdjustmentContext,\n adjustment: PerformanceAdjustmentRecord<Payload>,\n previousLevelIndex: number\n ) => {\n if (typeof options.onLevelChange !== \"function\") {\n return;\n }\n\n try {\n options.onLevelChange({\n context,\n previousLevel: levels[previousLevelIndex]!,\n currentLevel: levels[currentLevelIndex]!,\n adjustment,\n });\n } catch {\n // Change notifications must not destabilize the governor.\n }\n };\n\n const apply = (\n direction: \"down\" | \"up\",\n context: PerformanceAdjustmentContext\n ): PerformanceAdjustmentRecord<Payload> | null => {\n const nextLevelIndex =\n direction === \"down\" ? currentLevelIndex - 1 : currentLevelIndex + 1;\n\n if (nextLevelIndex < 0 || nextLevelIndex >= levels.length) {\n return null;\n }\n\n const previousLevelIndex = currentLevelIndex;\n currentLevelIndex = nextLevelIndex;\n\n const adjustment = buildAdjustment<Payload>(\n direction,\n id,\n domain,\n authority,\n importance,\n previousLevelIndex,\n nextLevelIndex,\n levels,\n context\n );\n\n emitChange(context, adjustment, previousLevelIndex);\n return adjustment;\n };\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n getCurrentLevel() {\n return levels[currentLevelIndex]!;\n },\n getSnapshot() {\n return buildSnapshot(\n id,\n domain,\n authority,\n importance,\n metadata,\n levels,\n currentLevelIndex\n );\n },\n stepDown(context) {\n return apply(\"down\", context);\n },\n stepUp(context) {\n return apply(\"up\", context);\n },\n };\n}\n","import { createQualityLadderAdapter } from \"./ladder.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport type {\n ModuleQualityLevel,\n WorkerJobBudgetAdapter,\n WorkerJobBudgetManifest,\n WorkerJobBudgetManifestGraph,\n WorkerJobBudgetManifestGraphJob,\n WorkerJobBudgetManifestPriorityLane,\n WorkerJobBudgetManifestAdapterOptions,\n WorkerJobBudgetManifestJob,\n WorkerJobBudgetAdapterOptions,\n WorkerJobBudgetConfig,\n WorkerJobBudgetSnapshot,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n normalizePlainObject,\n readNonNegativeNumber,\n readPositiveNumber,\n workerJobQueueClasses,\n workerSchedulerModes,\n} from \"./validation.js\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readPositiveInteger(name: string, value: unknown): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nfunction readNonNegativeInteger(name: string, value: unknown): number | undefined {\n const parsed = readNonNegativeNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return parsed;\n}\n\nfunction normalizeDependencies(\n name: string,\n value: unknown\n): readonly string[] {\n if (value === undefined) {\n return Object.freeze([]);\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of dependency ids.`);\n }\n\n return Object.freeze(\n [...new Set(value.map((entry, index) => assertIdentifier(`${name}[${index}]`, entry)))]\n );\n}\n\nfunction normalizeBudgetLevel(\n level: ModuleQualityLevel<WorkerJobBudgetConfig>,\n index: number\n): ModuleQualityLevel<WorkerJobBudgetConfig> {\n if (!isPlainObject(level.config)) {\n throw new Error(`Worker job budget level ${index} must provide an object config.`);\n }\n\n const levelId = assertIdentifier(`levels[${index}].id`, level.id);\n const maxDispatchesPerFrame = readPositiveInteger(\n `levels[${index}].config.maxDispatchesPerFrame`,\n level.config.maxDispatchesPerFrame\n );\n const maxJobsPerDispatch = readPositiveInteger(\n `levels[${index}].config.maxJobsPerDispatch`,\n level.config.maxJobsPerDispatch\n );\n const cadenceDivisor = readPositiveInteger(\n `levels[${index}].config.cadenceDivisor`,\n level.config.cadenceDivisor\n );\n const workgroupScale = readPositiveNumber(\n `levels[${index}].config.workgroupScale`,\n level.config.workgroupScale\n );\n const maxQueueDepth = readNonNegativeInteger(\n `levels[${index}].config.maxQueueDepth`,\n level.config.maxQueueDepth\n );\n\n if (workgroupScale !== undefined && workgroupScale > 1) {\n throw new Error(\n `levels[${index}].config.workgroupScale must be less than or equal to 1.`\n );\n }\n\n return {\n ...level,\n id: levelId,\n config: {\n maxDispatchesPerFrame: maxDispatchesPerFrame ?? 1,\n maxJobsPerDispatch: maxJobsPerDispatch ?? 1,\n cadenceDivisor,\n workgroupScale,\n maxQueueDepth,\n metadata: normalizePlainObject(\n `levels[${index}].config.metadata`,\n level.config.metadata\n ),\n },\n };\n}\n\nfunction normalizeManifestJobs(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): readonly WorkerJobBudgetManifestJob[] {\n if (Array.isArray(manifest)) {\n return manifest;\n }\n\n if (!isPlainObject(manifest) || !Array.isArray(manifest.jobs)) {\n throw new Error(\n \"Worker job manifests must provide a jobs array or be an array of jobs.\"\n );\n }\n\n return manifest.jobs;\n}\n\nfunction buildPriorityLanes(\n jobs: readonly WorkerJobBudgetManifestGraphJob[]\n): readonly WorkerJobBudgetManifestPriorityLane[] {\n const lanes = new Map<number, {\n priority: number;\n jobIds: string[];\n rootJobIds: string[];\n }>();\n\n for (const job of jobs) {\n const lane = lanes.get(job.priority) ?? {\n priority: job.priority,\n jobIds: [],\n rootJobIds: [],\n };\n lane.jobIds.push(job.id);\n if (job.root) {\n lane.rootJobIds.push(job.id);\n }\n lanes.set(job.priority, lane);\n }\n\n return Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobIds: Object.freeze([...lane.jobIds]),\n rootJobIds: Object.freeze([...lane.rootJobIds]),\n jobCount: lane.jobIds.length,\n rootCount: lane.rootJobIds.length,\n })\n )\n );\n}\n\nfunction resolveManifestJobType(job: WorkerJobBudgetManifestJob, index: number): string {\n const jobType = job.performance?.jobType ?? job.worker?.jobType;\n if (typeof jobType !== \"string\") {\n throw new Error(\n `Manifest job ${index} must provide performance.jobType or worker.jobType.`\n );\n }\n\n return assertIdentifier(`jobs[${index}].jobType`, jobType);\n}\n\nfunction resolveManifestQueueClass(\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"queueClass\"] {\n const queueClass = job.performance?.queueClass ?? job.worker?.queueClass;\n if (queueClass === undefined) {\n throw new Error(\n `Manifest job ${index} must provide performance.queueClass or worker.queueClass.`\n );\n }\n\n return assertEnumValue(`jobs[${index}].queueClass`, queueClass, workerJobQueueClasses);\n}\n\nfunction resolveManifestSchedulerMode(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"schedulerMode\"] {\n const topLevelMode =\n !Array.isArray(manifest) && isPlainObject(manifest)\n ? manifest.schedulerMode\n : undefined;\n const schedulerMode = job.worker?.schedulerMode ?? topLevelMode;\n\n if (schedulerMode === undefined) {\n return \"flat\";\n }\n\n return assertEnumValue(\n `jobs[${index}].schedulerMode`,\n schedulerMode,\n workerSchedulerModes\n );\n}\n\nfunction resolveManifestDependencies(\n job: WorkerJobBudgetManifestJob,\n index: number\n): readonly string[] {\n return normalizeDependencies(\n `jobs[${index}].dependencies`,\n job.worker?.dependencies\n );\n}\n\nfunction resolveManifestPriority(\n job: WorkerJobBudgetManifestJob,\n index: number\n): number {\n return readNonNegativeInteger(\n `jobs[${index}].priority`,\n job.worker?.priority\n ) ?? 0;\n}\n\nfunction buildManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n const jobs = normalizeManifestJobs(manifest);\n const normalized = jobs.map((job, index) => {\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const metadata = normalizePerformanceBudgetMetadata(\n `jobs[${index}].performance`,\n job.performance\n );\n\n return {\n id,\n key: typeof job.key === \"string\" ? job.key : undefined,\n label: typeof job.label === \"string\" ? job.label : undefined,\n jobType: resolveManifestJobType(job, index),\n queueClass: resolveManifestQueueClass(job, index),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority: resolveManifestPriority(job, index),\n dependencies: resolveManifestDependencies(job, index),\n schedulerMode: resolveManifestSchedulerMode(manifest, job, index),\n };\n });\n\n const ids = new Set<string>();\n for (const job of normalized) {\n if (ids.has(job.id)) {\n throw new Error(`Duplicate worker manifest job id detected: ${job.id}`);\n }\n ids.add(job.id);\n }\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n if (!ids.has(dependency)) {\n throw new Error(\n `Worker manifest job \"${job.id}\" depends on unknown job \"${dependency}\".`\n );\n }\n if (dependency === job.id) {\n throw new Error(`Worker manifest job \"${job.id}\" cannot depend on itself.`);\n }\n }\n }\n\n const dependentsById = new Map(normalized.map((job) => [job.id, [] as string[]]));\n const indegree = new Map(\n normalized.map((job) => [job.id, job.dependencies.length] as const)\n );\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n dependentsById.get(dependency)?.push(job.id);\n }\n }\n\n const roots = normalized\n .filter((job) => job.dependencies.length === 0)\n .map((job) => job.id);\n const queue = [...roots];\n const topologicalOrder: string[] = [];\n\n while (queue.length > 0) {\n const currentId = queue.shift();\n if (!currentId) {\n continue;\n }\n topologicalOrder.push(currentId);\n for (const dependentId of dependentsById.get(currentId) ?? []) {\n const next = (indegree.get(dependentId) ?? 0) - 1;\n indegree.set(dependentId, next);\n if (next === 0) {\n queue.push(dependentId);\n }\n }\n }\n\n if (topologicalOrder.length !== normalized.length) {\n throw new Error(\"Worker manifest graph contains a cycle.\");\n }\n\n const graphJobs = normalized.map((job) =>\n Object.freeze({\n ...job,\n dependencies: Object.freeze([...job.dependencies]),\n dependents: Object.freeze([...(dependentsById.get(job.id) ?? [])]),\n dependencyCount: job.dependencies.length,\n unresolvedDependencyCount: job.dependencies.length,\n dependentCount: (dependentsById.get(job.id) ?? []).length,\n root: job.dependencies.length === 0,\n })\n );\n\n return Object.freeze({\n schedulerMode: graphJobs.some(\n (job) => job.schedulerMode === \"dag\" || job.dependencies.length > 0\n )\n ? \"dag\"\n : \"flat\",\n jobCount: graphJobs.length,\n maxPriority: graphJobs.reduce(\n (current, job) => Math.max(current, job.priority),\n 0\n ),\n representationBands: Object.freeze(\n [\n ...new Set(\n graphJobs\n .map((job) => job.representationBand)\n .filter((band): band is NonNullable<typeof band> => typeof band === \"string\")\n ),\n ]\n ),\n jobIds: Object.freeze(graphJobs.map((job) => job.id)),\n roots: Object.freeze(graphJobs.filter((job) => job.root).map((job) => job.id)),\n topologicalOrder: Object.freeze(topologicalOrder),\n priorityLanes: buildPriorityLanes(graphJobs),\n jobs: Object.freeze(graphJobs),\n });\n}\n\n/**\n * Creates a ladder-backed adapter specialized for gpu-worker job budgets.\n */\nexport function createWorkerJobBudgetAdapter(\n options: WorkerJobBudgetAdapterOptions\n): WorkerJobBudgetAdapter {\n const jobType = assertIdentifier(\"jobType\", options.jobType);\n const queueClass =\n options.queueClass === undefined\n ? \"custom\"\n : assertEnumValue(\"queueClass\", options.queueClass, workerJobQueueClasses);\n const priority = readNonNegativeInteger(\"priority\", options.priority) ?? 0;\n const dependencies = normalizeDependencies(\"dependencies\", options.dependencies);\n const dependents = normalizeDependencies(\"dependents\", options.dependents);\n const schedulerMode =\n options.schedulerMode === undefined\n ? \"flat\"\n : assertEnumValue(\"schedulerMode\", options.schedulerMode, workerSchedulerModes);\n const dependencyCount = dependencies.length;\n const unresolvedDependencyCount = dependencyCount;\n const dependentCount = dependents.length;\n const root = dependencyCount === 0;\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n\n const levels = options.levels.map(normalizeBudgetLevel);\n\n const ladder = createQualityLadderAdapter<WorkerJobBudgetConfig>({\n id: options.id,\n domain: options.domain ?? \"custom\",\n authority: options.authority,\n importance: options.importance,\n levels,\n initialLevel: options.initialLevel,\n onLevelChange: options.onLevelChange,\n });\n\n const getWorkerSnapshot = (): WorkerJobBudgetSnapshot => ({\n ...ladder.getSnapshot(),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n jobType,\n queueClass,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n });\n\n return {\n ...ladder,\n jobType,\n queueClass,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n getSnapshot() {\n return getWorkerSnapshot();\n },\n getBudget() {\n return ladder.getCurrentLevel().config;\n },\n getWorkerSnapshot,\n };\n}\n\n/**\n * Normalizes a worker manifest into a graph with roots, dependents, and\n * priority lanes so runtimes can reason about multi-root DAG workloads.\n */\nexport function createWorkerJobBudgetManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n return buildManifestGraph(manifest);\n}\n\n/**\n * Creates worker budget adapters from a consumer worker-manifest shape.\n */\nexport function createWorkerJobBudgetAdaptersFromManifest(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n options: WorkerJobBudgetManifestAdapterOptions = {}\n): readonly WorkerJobBudgetAdapter[] {\n const graph = buildManifestGraph(manifest);\n const graphJobById = new Map(graph.jobs.map((job) => [job.id, job]));\n const jobs = normalizeManifestJobs(manifest);\n const { initialLevels, selectJob, onLevelChange } = options;\n\n return jobs.flatMap((job, index) => {\n if (selectJob && !selectJob(job, index)) {\n return [];\n }\n\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const graphJob = graphJobById.get(id);\n if (!graphJob) {\n throw new Error(`Worker manifest graph is missing job \"${id}\".`);\n }\n\n return [\n createWorkerJobBudgetAdapter({\n id,\n jobType: graphJob.jobType,\n queueClass: graphJob.queueClass,\n priority: graphJob.priority,\n dependencies: graphJob.dependencies,\n dependents: graphJob.dependents,\n schedulerMode: graphJob.schedulerMode,\n domain: job.performance.domain,\n authority: job.performance.authority,\n importance: job.performance.importance,\n representationBand: job.performance.representationBand,\n qualityDimensions: job.performance.qualityDimensions,\n importanceSignals: job.performance.importanceSignals,\n levels: job.performance.levels,\n initialLevel: initialLevels?.[id],\n onLevelChange:\n onLevelChange === undefined\n ? undefined\n : (event) => {\n onLevelChange(job, event);\n },\n }),\n ];\n });\n}\n","import type {\n GpuDebugAdapterInfo,\n GpuPipelinePhase,\n GpuDebugQueueClass,\n GpuResourceCategory,\n GpuVector3,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const gpuDebugQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"transfer\",\n \"custom\",\n]) satisfies readonly GpuDebugQueueClass[];\n\nexport const gpuResourceCategories = Object.freeze([\n \"buffer\",\n \"texture\",\n \"bind-group\",\n \"pipeline\",\n \"custom\",\n]) satisfies readonly GpuResourceCategory[];\n\nexport const gpuPipelinePhases = Object.freeze([\n \"simulation\",\n \"secondary-simulation\",\n \"scene-preparation\",\n \"render\",\n]) satisfies readonly GpuPipelinePhase[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(`${name} must be one of: ${allowedValues.join(\", \")}.`);\n }\n\n return value as T;\n}\n\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\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\n return value;\n}\n\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function readPositiveInteger(\n name: string,\n value: unknown\n): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\nexport function normalizeVector(\n name: string,\n value: GpuVector3\n): Required<GpuVector3> {\n const x = readPositiveInteger(`${name}.x`, value.x) ?? 1;\n const y = readPositiveInteger(`${name}.y`, value.y) ?? 1;\n const z = readPositiveInteger(`${name}.z`, value.z) ?? 1;\n return { x, y, z };\n}\n\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n\nexport function normalizeAdapterInfo(\n value: GpuDebugAdapterInfo | undefined\n): Readonly<GpuDebugAdapterInfo> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n const adapter: GpuDebugAdapterInfo = {};\n\n if (value.label !== undefined) {\n adapter.label = String(value.label).trim().slice(0, 120);\n }\n if (value.vendor !== undefined) {\n adapter.vendor = String(value.vendor).trim().slice(0, 120);\n }\n if (value.architecture !== undefined) {\n adapter.architecture = String(value.architecture).trim().slice(0, 120);\n }\n if (value.driver !== undefined) {\n adapter.driver = String(value.driver).trim().slice(0, 120);\n }\n\n adapter.maxBufferSizeBytes = readPositiveInteger(\n \"adapter.maxBufferSizeBytes\",\n value.maxBufferSizeBytes\n );\n adapter.maxStorageBufferBindingSizeBytes = readPositiveInteger(\n \"adapter.maxStorageBufferBindingSizeBytes\",\n value.maxStorageBufferBindingSizeBytes\n );\n adapter.maxComputeInvocationsPerWorkgroup = readPositiveInteger(\n \"adapter.maxComputeInvocationsPerWorkgroup\",\n value.maxComputeInvocationsPerWorkgroup\n );\n adapter.maxComputeWorkgroupsPerDimension = readPositiveInteger(\n \"adapter.maxComputeWorkgroupsPerDimension\",\n value.maxComputeWorkgroupsPerDimension\n );\n adapter.memoryCapacityHintBytes = readPositiveInteger(\n \"adapter.memoryCapacityHintBytes\",\n value.memoryCapacityHintBytes\n );\n adapter.coreCountHint = readPositiveInteger(\n \"adapter.coreCountHint\",\n value.coreCountHint\n );\n adapter.metadata = normalizePlainObject(\"adapter.metadata\", value.metadata);\n\n return Object.freeze(adapter);\n}\n","import type {\n GpuDebugDagSnapshot,\n GpuDebugDispatchSnapshot,\n GpuDebugPipelineSnapshot,\n GpuDebugQueueSnapshot,\n GpuDebugSession,\n GpuDebugSessionOptions,\n GpuDebugSnapshot,\n GpuDependencyUnlockSample,\n GpuDispatchSample,\n GpuFrameSample,\n GpuPipelinePhaseSample,\n GpuQueueSample,\n GpuReadyLaneSample,\n GpuResourceCategory,\n TrackedGpuAllocation,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n gpuDebugQueueClasses,\n gpuPipelinePhases,\n gpuResourceCategories,\n isAbortSignalLike,\n normalizeAdapterInfo,\n normalizeVector,\n readNonNegativeNumber,\n readPositiveInteger,\n readPositiveNumber,\n} from \"./validation.js\";\n\nconst DEFAULT_OPTIONS = Object.freeze({\n enabled: false,\n maxRetainedDispatches: 240,\n maxRetainedQueueSamples: 240,\n maxRetainedReadyLaneSamples: 240,\n maxRetainedDependencyUnlockSamples: 240,\n maxRetainedPipelinePhaseSamples: 240,\n maxRetainedFrameSamples: 240,\n maxTrackedAllocations: 512,\n});\n\nconst LIMITATIONS = Object.freeze([\n \"Tracked memory reflects only allocations reported to this debug session.\",\n \"Portable WebGPU does not expose authoritative live GPU core-count or total-memory counters.\",\n \"Hardware hints are optional caller-supplied metadata and may be platform-specific.\",\n \"Ready-lane and dependency-unlock diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n \"Pipeline phase and snapshot-lag diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n]);\n\ninterface NormalizedAllocation extends Omit<TrackedGpuAllocation, \"signal\"> {\n label?: string;\n}\n\ntype NormalizedQueueSample = Omit<GpuQueueSample, \"signal\">;\n\ninterface NormalizedReadyLaneSample extends Omit<GpuReadyLaneSample, \"signal\"> {\n priority?: number;\n}\n\ninterface NormalizedDispatchSample extends Omit<GpuDispatchSample, \"signal\"> {\n workgroups: { x: number; y: number; z: number };\n workgroupSize: { x: number; y: number; z: number };\n}\n\ntype NormalizedFrameSample = Omit<GpuFrameSample, \"signal\">;\n\ninterface NormalizedDependencyUnlockSample\n extends Omit<GpuDependencyUnlockSample, \"signal\"> {\n priority?: number;\n unlockCount: number;\n}\n\ninterface NormalizedPipelinePhaseSample\n extends Omit<GpuPipelinePhaseSample, \"signal\"> {\n durationMs?: number;\n snapshotAgeFrames?: number;\n snapshotAgeMs?: number;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n return Math.min(Math.round(value), 4096);\n}\n\nfunction trimHistory<T>(items: T[], maxEntries: number): void {\n while (items.length > maxEntries) {\n items.shift();\n }\n}\n\nfunction average(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction pushAggregate<T extends string | number>(\n map: Map<T, number>,\n key: T,\n value: number\n): void {\n map.set(key, (map.get(key) ?? 0) + value);\n}\n\nfunction normalizeAllocation(allocation: TrackedGpuAllocation): NormalizedAllocation {\n if (allocation.signal !== undefined && !isAbortSignalLike(allocation.signal)) {\n throw new Error(\"allocation.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id: assertIdentifier(\"allocation.id\", allocation.id),\n owner: assertIdentifier(\"allocation.owner\", allocation.owner),\n category: assertEnumValue(\n \"allocation.category\",\n allocation.category,\n gpuResourceCategories\n ),\n sizeBytes: readPositiveInteger(\"allocation.sizeBytes\", allocation.sizeBytes) ?? 1,\n label:\n allocation.label === undefined\n ? undefined\n : String(allocation.label).trim().slice(0, 120),\n };\n}\n\nfunction normalizeQueueSample(sample: GpuQueueSample): NormalizedQueueSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"queue.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"queue.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"queue.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"queue.depth cannot exceed queue.capacity.\");\n }\n\n return {\n owner: assertIdentifier(\"queue.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"queue.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"queue.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeReadyLaneSample(\n sample: GpuReadyLaneSample\n): NormalizedReadyLaneSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"readyLane.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"readyLane.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"readyLane.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"readyLane.depth cannot exceed readyLane.capacity.\");\n }\n\n const priority = readNonNegativeNumber(\"readyLane.priority\", sample.priority);\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\"readyLane.priority must be an integer greater than or equal to zero.\");\n }\n\n return {\n owner: assertIdentifier(\"readyLane.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"readyLane.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n laneId: assertIdentifier(\"readyLane.laneId\", sample.laneId),\n priority,\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"readyLane.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeDispatchSample(\n sample: GpuDispatchSample\n): NormalizedDispatchSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dispatch.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id:\n sample.id === undefined ? undefined : assertIdentifier(\"dispatch.id\", sample.id),\n owner: assertIdentifier(\"dispatch.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dispatch.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n jobType: assertIdentifier(\"dispatch.jobType\", sample.jobType),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dispatch.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\"dispatch.durationMs\", sample.durationMs),\n workgroups: normalizeVector(\"dispatch.workgroups\", sample.workgroups),\n workgroupSize: normalizeVector(\n \"dispatch.workgroupSize\",\n sample.workgroupSize ?? { x: 1, y: 1, z: 1 }\n ),\n bytesRead: readNonNegativeNumber(\"dispatch.bytesRead\", sample.bytesRead),\n bytesWritten: readNonNegativeNumber(\"dispatch.bytesWritten\", sample.bytesWritten),\n };\n}\n\nfunction normalizeFrameSample(sample: GpuFrameSample): NormalizedFrameSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"frame.signal must be an AbortSignal when provided.\");\n }\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"frame.dropped must be a boolean when provided.\");\n }\n\n return {\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"frame.frameId\", sample.frameId),\n frameTimeMs: readPositiveNumber(\"frame.frameTimeMs\", sample.frameTimeMs) ?? 0,\n targetFrameTimeMs: readPositiveNumber(\n \"frame.targetFrameTimeMs\",\n sample.targetFrameTimeMs\n ),\n gpuBusyMs: readNonNegativeNumber(\"frame.gpuBusyMs\", sample.gpuBusyMs),\n dropped: sample.dropped,\n };\n}\n\nfunction normalizeDependencyUnlockSample(\n sample: GpuDependencyUnlockSample\n): NormalizedDependencyUnlockSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dependencyUnlock.signal must be an AbortSignal when provided.\");\n }\n\n const priority = readNonNegativeNumber(\n \"dependencyUnlock.priority\",\n sample.priority\n );\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\n \"dependencyUnlock.priority must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"dependencyUnlock.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dependencyUnlock.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n sourceJobType: assertIdentifier(\n \"dependencyUnlock.sourceJobType\",\n sample.sourceJobType\n ),\n unlockedJobType: assertIdentifier(\n \"dependencyUnlock.unlockedJobType\",\n sample.unlockedJobType\n ),\n priority,\n unlockCount:\n readPositiveInteger(\"dependencyUnlock.unlockCount\", sample.unlockCount) ?? 1,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dependencyUnlock.frameId\", sample.frameId),\n };\n}\n\nfunction normalizePipelinePhaseSample(\n sample: GpuPipelinePhaseSample\n): NormalizedPipelinePhaseSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"pipelinePhase.signal must be an AbortSignal when provided.\");\n }\n\n const snapshotAgeFrames = readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeFrames\",\n sample.snapshotAgeFrames\n );\n if (snapshotAgeFrames !== undefined && !Number.isInteger(snapshotAgeFrames)) {\n throw new Error(\n \"pipelinePhase.snapshotAgeFrames must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"pipelinePhase.owner\", sample.owner),\n pipeline: assertEnumValue(\n \"pipelinePhase.pipeline\",\n sample.pipeline,\n gpuPipelinePhases\n ),\n stage: assertIdentifier(\"pipelinePhase.stage\", sample.stage),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\n \"pipelinePhase.durationMs\",\n sample.durationMs\n ),\n snapshotFrameId:\n sample.snapshotFrameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.snapshotFrameId\", sample.snapshotFrameId),\n snapshotAgeFrames,\n snapshotAgeMs: readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeMs\",\n sample.snapshotAgeMs\n ),\n };\n}\n\nexport function estimateDispatchInvocations(sample: GpuDispatchSample): number {\n const normalized = normalizeDispatchSample(sample);\n return (\n normalized.workgroups.x *\n normalized.workgroups.y *\n normalized.workgroups.z *\n normalized.workgroupSize.x *\n normalized.workgroupSize.y *\n normalized.workgroupSize.z\n );\n}\n\nexport function createGpuDebugSession(\n options: GpuDebugSessionOptions = {}\n): GpuDebugSession {\n const settings = {\n enabled: options.enabled ?? DEFAULT_OPTIONS.enabled,\n maxRetainedDispatches: clampCount(\n options.maxRetainedDispatches,\n DEFAULT_OPTIONS.maxRetainedDispatches\n ),\n maxRetainedQueueSamples: clampCount(\n options.maxRetainedQueueSamples,\n DEFAULT_OPTIONS.maxRetainedQueueSamples\n ),\n maxRetainedReadyLaneSamples: clampCount(\n options.maxRetainedReadyLaneSamples,\n DEFAULT_OPTIONS.maxRetainedReadyLaneSamples\n ),\n maxRetainedDependencyUnlockSamples: clampCount(\n options.maxRetainedDependencyUnlockSamples,\n DEFAULT_OPTIONS.maxRetainedDependencyUnlockSamples\n ),\n maxRetainedPipelinePhaseSamples: clampCount(\n options.maxRetainedPipelinePhaseSamples,\n DEFAULT_OPTIONS.maxRetainedPipelinePhaseSamples\n ),\n maxRetainedFrameSamples: clampCount(\n options.maxRetainedFrameSamples,\n DEFAULT_OPTIONS.maxRetainedFrameSamples\n ),\n maxTrackedAllocations: clampCount(\n options.maxTrackedAllocations,\n DEFAULT_OPTIONS.maxTrackedAllocations\n ),\n };\n\n const adapter = normalizeAdapterInfo(options.adapter);\n let enabled = settings.enabled;\n const allocations = new Map<string, NormalizedAllocation>();\n const allocationOrder: string[] = [];\n const queueSamples: NormalizedQueueSample[] = [];\n const readyLaneSamples: NormalizedReadyLaneSample[] = [];\n const dispatchSamples: NormalizedDispatchSample[] = [];\n const dependencyUnlockSamples: NormalizedDependencyUnlockSample[] = [];\n const pipelinePhaseSamples: NormalizedPipelinePhaseSample[] = [];\n const frameSamples: NormalizedFrameSample[] = [];\n let peakTrackedBytes = 0;\n\n const totalTrackedBytes = (): number =>\n [...allocations.values()].reduce((total, allocation) => total + allocation.sizeBytes, 0);\n\n const updatePeakTrackedBytes = (): void => {\n peakTrackedBytes = Math.max(peakTrackedBytes, totalTrackedBytes());\n };\n\n const ensureAllocationCapacity = (): void => {\n while (allocationOrder.length > settings.maxTrackedAllocations) {\n const oldestId = allocationOrder.shift();\n if (oldestId !== undefined) {\n allocations.delete(oldestId);\n }\n }\n };\n\n const buildDispatchSnapshot = (): GpuDebugDispatchSnapshot => {\n const durations = dispatchSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const bytesRead = dispatchSamples\n .map((sample) => sample.bytesRead)\n .filter((value): value is number => value !== undefined);\n const bytesWritten = dispatchSamples\n .map((sample) => sample.bytesWritten)\n .filter((value): value is number => value !== undefined);\n\n const byQueueClass = new Map<\n NormalizedDispatchSample[\"queueClass\"],\n {\n queueClass: NormalizedDispatchSample[\"queueClass\"];\n dispatches: number;\n totalDurationMs: number;\n estimatedInvocations: number;\n }\n >();\n\n let estimatedWorkgroups = 0;\n let estimatedInvocations = 0;\n\n for (const sample of dispatchSamples) {\n const workgroupCount =\n sample.workgroups.x * sample.workgroups.y * sample.workgroups.z;\n const invocationCount =\n workgroupCount *\n sample.workgroupSize.x *\n sample.workgroupSize.y *\n sample.workgroupSize.z;\n estimatedWorkgroups += workgroupCount;\n estimatedInvocations += invocationCount;\n\n const bucket = byQueueClass.get(sample.queueClass) ?? {\n queueClass: sample.queueClass,\n dispatches: 0,\n totalDurationMs: 0,\n estimatedInvocations: 0,\n };\n bucket.dispatches += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n bucket.estimatedInvocations += invocationCount;\n byQueueClass.set(sample.queueClass, bucket);\n }\n\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const totalFrameTimeMs = frameTimes.reduce((total, value) => total + value, 0);\n const totalDurationMs = durations.reduce((total, value) => total + value, 0);\n\n return {\n sampleCount: dispatchSamples.length,\n totalDurationMs,\n averageDurationMs: average(durations),\n estimatedWorkgroups,\n estimatedInvocations,\n averageBytesRead: average(bytesRead),\n averageBytesWritten: average(bytesWritten),\n busyRatio:\n totalFrameTimeMs > 0 ? Math.min(totalDurationMs / totalFrameTimeMs, 1) : undefined,\n byQueueClass: [...byQueueClass.values()].sort(\n (left, right) => right.totalDurationMs - left.totalDurationMs\n ),\n };\n };\n\n const buildQueueSnapshot = (): GpuDebugQueueSnapshot => {\n const depths = queueSamples.map((sample) => sample.depth);\n const hottestQueues = queueSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakUtilizationRatio = queueSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n return {\n sampleCount: queueSamples.length,\n averageDepth: average(depths) ?? 0,\n peakDepth: depths.length === 0 ? 0 : Math.max(...depths),\n peakUtilizationRatio,\n hottestQueues,\n };\n };\n\n const buildDagSnapshot = (): GpuDebugDagSnapshot => {\n const laneDepths = readyLaneSamples.map((sample) => sample.depth);\n const hottestReadyLanes = readyLaneSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n laneId: sample.laneId,\n priority: sample.priority,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakReadyLaneUtilizationRatio = readyLaneSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n const bySourceJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n sourceJobType: string;\n unlockCount: number;\n }\n >();\n const byUnlockedJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n unlockedJobType: string;\n priority?: number;\n unlockCount: number;\n }\n >();\n\n let totalUnlockCount = 0;\n\n for (const sample of dependencyUnlockSamples) {\n totalUnlockCount += sample.unlockCount;\n\n const sourceKey = `${sample.owner}:${sample.queueClass}:${sample.sourceJobType}`;\n const unlockedKey =\n `${sample.owner}:${sample.queueClass}:` +\n `${sample.unlockedJobType}:${sample.priority ?? \"none\"}`;\n\n const sourceBucket = bySourceJobType.get(sourceKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n sourceJobType: sample.sourceJobType,\n unlockCount: 0,\n };\n sourceBucket.unlockCount += sample.unlockCount;\n bySourceJobType.set(sourceKey, sourceBucket);\n\n const unlockedBucket = byUnlockedJobType.get(unlockedKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n unlockedJobType: sample.unlockedJobType,\n priority: sample.priority,\n unlockCount: 0,\n };\n unlockedBucket.unlockCount += sample.unlockCount;\n byUnlockedJobType.set(unlockedKey, unlockedBucket);\n }\n\n return {\n readyLaneSampleCount: readyLaneSamples.length,\n averageReadyLaneDepth: average(laneDepths) ?? 0,\n peakReadyLaneDepth: laneDepths.length === 0 ? 0 : Math.max(...laneDepths),\n peakReadyLaneUtilizationRatio,\n hottestReadyLanes,\n dependencyUnlockSampleCount: dependencyUnlockSamples.length,\n totalUnlockCount,\n bySourceJobType: [...bySourceJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n byUnlockedJobType: [...byUnlockedJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n };\n };\n\n const buildPipelineSnapshot = (): GpuDebugPipelineSnapshot => {\n const durations = pipelinePhaseSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeMsValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeFrameValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeFrames)\n .filter((value): value is number => value !== undefined);\n\n const byPipeline = new Map<\n NormalizedPipelinePhaseSample[\"pipeline\"],\n {\n pipeline: NormalizedPipelinePhaseSample[\"pipeline\"];\n sampleCount: number;\n totalDurationMs: number;\n durationValues: number[];\n snapshotAgeMsValues: number[];\n snapshotAgeFramesValues: number[];\n }\n >();\n\n for (const sample of pipelinePhaseSamples) {\n const bucket = byPipeline.get(sample.pipeline) ?? {\n pipeline: sample.pipeline,\n sampleCount: 0,\n totalDurationMs: 0,\n durationValues: [],\n snapshotAgeMsValues: [],\n snapshotAgeFramesValues: [],\n };\n bucket.sampleCount += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n if (sample.durationMs !== undefined) {\n bucket.durationValues.push(sample.durationMs);\n }\n if (sample.snapshotAgeMs !== undefined) {\n bucket.snapshotAgeMsValues.push(sample.snapshotAgeMs);\n }\n if (sample.snapshotAgeFrames !== undefined) {\n bucket.snapshotAgeFramesValues.push(sample.snapshotAgeFrames);\n }\n byPipeline.set(sample.pipeline, bucket);\n }\n\n const hottestStages = pipelinePhaseSamples\n .map((sample) => ({\n owner: sample.owner,\n pipeline: sample.pipeline,\n stage: sample.stage,\n frameId: sample.frameId,\n durationMs: sample.durationMs,\n snapshotFrameId: sample.snapshotFrameId,\n snapshotAgeFrames: sample.snapshotAgeFrames,\n snapshotAgeMs: sample.snapshotAgeMs,\n }))\n .sort((left, right) => {\n const leftScore =\n left.durationMs ??\n left.snapshotAgeMs ??\n left.snapshotAgeFrames ??\n 0;\n const rightScore =\n right.durationMs ??\n right.snapshotAgeMs ??\n right.snapshotAgeFrames ??\n 0;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n return {\n sampleCount: pipelinePhaseSamples.length,\n totalDurationMs: durations.reduce((total, value) => total + value, 0),\n averageDurationMs: average(durations),\n averageSnapshotAgeMs: average(snapshotAgeMsValues),\n maxSnapshotAgeMs:\n snapshotAgeMsValues.length > 0 ? Math.max(...snapshotAgeMsValues) : undefined,\n maxSnapshotAgeFrames:\n snapshotAgeFrameValues.length > 0\n ? Math.max(...snapshotAgeFrameValues)\n : undefined,\n byPipeline: [...byPipeline.values()]\n .map((bucket) => ({\n pipeline: bucket.pipeline,\n sampleCount: bucket.sampleCount,\n totalDurationMs: bucket.totalDurationMs,\n averageDurationMs: average(bucket.durationValues),\n averageSnapshotAgeMs: average(bucket.snapshotAgeMsValues),\n maxSnapshotAgeMs:\n bucket.snapshotAgeMsValues.length > 0\n ? Math.max(...bucket.snapshotAgeMsValues)\n : undefined,\n maxSnapshotAgeFrames:\n bucket.snapshotAgeFramesValues.length > 0\n ? Math.max(...bucket.snapshotAgeFramesValues)\n : undefined,\n }))\n .sort((left, right) => right.totalDurationMs - left.totalDurationMs),\n hottestStages,\n };\n };\n\n return {\n isEnabled() {\n return enabled;\n },\n setEnabled(nextEnabled) {\n enabled = Boolean(nextEnabled);\n },\n trackAllocation(allocation) {\n if (!enabled || allocation.signal?.aborted === true) {\n return () => {};\n }\n\n const normalized = normalizeAllocation(allocation);\n if (!allocations.has(normalized.id)) {\n allocationOrder.push(normalized.id);\n }\n allocations.set(normalized.id, normalized);\n ensureAllocationCapacity();\n updatePeakTrackedBytes();\n\n return () => {\n this.releaseAllocation(normalized.id);\n };\n },\n releaseAllocation(id) {\n const normalizedId = assertIdentifier(\"allocation.id\", id);\n const deleted = allocations.delete(normalizedId);\n if (!deleted) {\n return false;\n }\n\n const index = allocationOrder.indexOf(normalizedId);\n if (index >= 0) {\n allocationOrder.splice(index, 1);\n }\n\n return true;\n },\n recordQueue(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n queueSamples.push(normalizeQueueSample(sample));\n trimHistory(queueSamples, settings.maxRetainedQueueSamples);\n return true;\n },\n recordReadyLane(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n readyLaneSamples.push(normalizeReadyLaneSample(sample));\n trimHistory(readyLaneSamples, settings.maxRetainedReadyLaneSamples);\n return true;\n },\n recordDispatch(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dispatchSamples.push(normalizeDispatchSample(sample));\n trimHistory(dispatchSamples, settings.maxRetainedDispatches);\n return true;\n },\n recordDependencyUnlock(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dependencyUnlockSamples.push(normalizeDependencyUnlockSample(sample));\n trimHistory(\n dependencyUnlockSamples,\n settings.maxRetainedDependencyUnlockSamples\n );\n return true;\n },\n recordPipelinePhase(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n pipelinePhaseSamples.push(normalizePipelinePhaseSample(sample));\n trimHistory(\n pipelinePhaseSamples,\n settings.maxRetainedPipelinePhaseSamples\n );\n return true;\n },\n recordFrame(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n frameSamples.push(normalizeFrameSample(sample));\n trimHistory(frameSamples, settings.maxRetainedFrameSamples);\n return true;\n },\n getSnapshot() {\n const memoryByOwner = new Map<string, number>();\n const memoryByCategory = new Map<GpuResourceCategory, number>();\n for (const allocation of allocations.values()) {\n pushAggregate(memoryByOwner, allocation.owner, allocation.sizeBytes);\n pushAggregate(memoryByCategory, allocation.category, allocation.sizeBytes);\n }\n\n const totalBytes = totalTrackedBytes();\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const targetFrameTimes = frameSamples\n .map((sample) => sample.targetFrameTimeMs)\n .filter((value): value is number => value !== undefined);\n const gpuBusyTimes = frameSamples\n .map((sample) => sample.gpuBusyMs)\n .filter((value): value is number => value !== undefined);\n\n const snapshot: GpuDebugSnapshot = {\n enabled,\n adapter,\n memory: {\n totalTrackedBytes: totalBytes,\n peakTrackedBytes,\n allocationCount: allocations.size,\n trackedUsageRatio:\n adapter.memoryCapacityHintBytes !== undefined\n ? totalBytes / adapter.memoryCapacityHintBytes\n : undefined,\n byOwner: [...memoryByOwner.entries()]\n .map(([owner, bytes]) => ({ owner, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n byCategory: [...memoryByCategory.entries()]\n .map(([category, bytes]) => ({ category, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n },\n dispatch: buildDispatchSnapshot(),\n queues: buildQueueSnapshot(),\n frames: {\n sampleCount: frameSamples.length,\n latestFrameTimeMs: frameSamples[frameSamples.length - 1]?.frameTimeMs,\n averageFrameTimeMs: average(frameTimes),\n averageTargetFrameTimeMs: average(targetFrameTimes),\n droppedFrameRatio:\n frameSamples.length > 0\n ? frameSamples.filter((sample) => sample.dropped === true).length /\n frameSamples.length\n : undefined,\n averageGpuBusyMs: average(gpuBusyTimes),\n },\n dag: buildDagSnapshot(),\n pipeline: buildPipelineSnapshot(),\n limitations: LIMITATIONS,\n };\n\n return snapshot;\n },\n reset() {\n allocations.clear();\n allocationOrder.splice(0, allocationOrder.length);\n queueSamples.splice(0, queueSamples.length);\n readyLaneSamples.splice(0, readyLaneSamples.length);\n dispatchSamples.splice(0, dispatchSamples.length);\n dependencyUnlockSamples.splice(0, dependencyUnlockSamples.length);\n pipelinePhaseSamples.splice(0, pipelinePhaseSamples.length);\n frameSamples.splice(0, frameSamples.length);\n peakTrackedBytes = 0;\n },\n };\n}\n","export const physicsDebugOwner = \"physics\";\nexport const physicsWorkerQueueClasses = Object.freeze({\n simulation: \"simulation\",\n render: \"render\",\n});\nexport const defaultPhysicsWorkerProfile = \"gameplay\";\nexport const physicsSimulationStageOrder = Object.freeze([\n \"intentResolution\",\n \"broadphase\",\n \"narrowphase\",\n \"solver\",\n \"authoritativeCommit\",\n \"secondarySimulation\",\n \"animationStateInputs\",\n \"worldSnapshot\",\n \"visualFollowUp\",\n]);\n\nfunction assertIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeNumber(name, value) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction normalizeMetadata(value) {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"snapshot.metadata must be a plain object when provided.\");\n }\n\n return Object.freeze({ ...value });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst physicsWorkerProfileSpecs = {\n gameplay: {\n description:\n \"Authoritative gameplay profile that preserves rigid-body stability while scaling visual sync and contact presentation work.\",\n suggestedAllocationIds: [\n \"physics.gameplay.broadphase.grid\",\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1024,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n },\n },\n cinematic: {\n description:\n \"Cinematic profile that keeps authoritative rigid-body work stable while enabling degradable cloth and fracture assistance passes.\",\n suggestedAllocationIds: [\n \"physics.cinematic.broadphase.grid\",\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n \"physics.cinematic.fracture.proxy\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 896,\n },\n high: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1152,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 1.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 960,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 2.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 320,\n },\n medium: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n clothAssist: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.clothAssist\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.cloth.state\"],\n },\n fracturePreview: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"geometry\",\n authority: \"non-authoritative-simulation\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.fracturePreview\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 4,\n workgroupScale: 0.35,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 160,\n },\n high: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.fracture.proxy\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n ],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 224,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n },\n },\n};\n\nconst physicsWorkerDagSpecs = {\n gameplay: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: { priority: 3, dependencies: [\"animationStateInputs\"] },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n cinematic: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n clothAssist: { priority: 2, dependencies: [\"authoritativeCommit\"] },\n fracturePreview: { priority: 1, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: {\n priority: 3,\n dependencies: [\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ],\n },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n};\n\nconst physicsSimulationPlanSpecs = Object.freeze({\n gameplay: Object.freeze({\n description:\n \"Gameplay simulation plan that hands off a stable post-commit world snapshot to visual preparation.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.worldSnapshot\",\n dependencies: Object.freeze([\"animationStateInputs\"]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n cinematic: Object.freeze({\n description:\n \"Cinematic simulation plan that runs degradable secondary simulation before publishing a stable world snapshot.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"clothAssist\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.clothAssist\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"cloth-secondary-state\",\n }),\n Object.freeze({\n id: \"fracturePreview\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.fracturePreview\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"fracture-preview-state\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.worldSnapshot\",\n dependencies: Object.freeze([\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n});\n\nfunction buildPhysicsWorkerManifestJob(profileName, key, spec) {\n const label = `physics.${profileName}.${key}`;\n const dag = physicsWorkerDagSpecs[profileName][key];\n const dependencies = dag.dependencies.map(\n (dependency) => `physics.${profileName}.${dependency}`\n );\n\n return Object.freeze({\n key,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: spec.queueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: physicsDebugOwner,\n queueClass: spec.queueClass,\n jobType: label,\n tags: Object.freeze([\n \"physics\",\n profileName,\n key,\n spec.authority,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildPhysicsWorkerManifest(profileName, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: physicsDebugOwner,\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildPhysicsWorkerManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\nexport const physicsWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(physicsWorkerProfileSpecs).map(([profileName, spec]) => [\n profileName,\n buildPhysicsWorkerManifest(profileName, spec),\n ])\n )\n);\n\nexport const physicsWorkerProfileNames = Object.freeze(\n Object.keys(physicsWorkerManifests)\n);\n\nexport function getPhysicsWorkerManifest(\n profile = defaultPhysicsWorkerProfile\n) {\n const manifest = physicsWorkerManifests[profile];\n if (!manifest) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function createPhysicsSimulationPlan(\n profile = defaultPhysicsWorkerProfile\n) {\n const plan = physicsSimulationPlanSpecs[profile];\n if (!plan) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n return Object.freeze({\n profile,\n description: plan.description,\n snapshotStageId: plan.snapshotStageId,\n snapshotStability: \"post-authoritative-commit\",\n stageOrder: Object.freeze(plan.stages.map((stage) => stage.id)),\n secondarySimulationStageIds: plan.secondarySimulationStageIds,\n stages: plan.stages,\n });\n}\n\nexport function createPhysicsWorldSnapshot(input) {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new Error(\"snapshot input must be a plain object.\");\n }\n\n const profile = input.profile ?? defaultPhysicsWorkerProfile;\n if (!physicsWorkerManifests[profile]) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n const bodyCount =\n input.bodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.bodyCount\", input.bodyCount);\n const dynamicBodyCount =\n input.dynamicBodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.dynamicBodyCount\",\n input.dynamicBodyCount\n );\n const contactCount =\n input.contactCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.contactCount\", input.contactCount);\n\n return Object.freeze({\n schemaVersion: 1,\n stage: \"worldSnapshot\",\n stability: \"post-authoritative-commit\",\n profile,\n frameId: assertIdentifier(\"snapshot.frameId\", input.frameId),\n tick: assertNonNegativeInteger(\"snapshot.tick\", input.tick),\n simulationTimeMs: assertNonNegativeNumber(\n \"snapshot.simulationTimeMs\",\n input.simulationTimeMs\n ),\n authoritativeTransformRevision: assertNonNegativeInteger(\n \"snapshot.authoritativeTransformRevision\",\n input.authoritativeTransformRevision\n ),\n secondarySimulationRevision:\n input.secondarySimulationRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.secondarySimulationRevision\",\n input.secondarySimulationRevision\n ),\n animationInputRevision:\n input.animationInputRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.animationInputRevision\",\n input.animationInputRevision\n ),\n bodyCount,\n dynamicBodyCount,\n contactCount,\n includesSecondarySimulation: input.secondarySimulationRevision !== undefined,\n metadata: normalizeMetadata(input.metadata),\n });\n}\n","import {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n} from \"./chunk-CNTXT5QJ.js\";\nexport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n};\n//# sourceMappingURL=browser.js.map","import {\n clothGarmentKinds,\n clothProfileNames,\n createClothContinuityEnvelope,\n createClothRepresentationPlan,\n selectClothRepresentationBand,\n} from \"@plasius/gpu-cloth\";\nimport {\n fluidBodyKinds,\n fluidProfileNames,\n createFluidContinuityEnvelope,\n createFluidRepresentationPlan,\n selectFluidRepresentationBand,\n} from \"@plasius/gpu-fluid\";\nimport {\n createLightingBandPlan,\n defaultLightingProfile,\n getLightingProfile,\n lightingDistanceBands,\n} from \"@plasius/gpu-lighting\";\nimport {\n createDeviceProfile,\n createGpuPerformanceGovernor,\n createQualityLadderAdapter,\n} from \"@plasius/gpu-performance\";\nimport { createGpuDebugSession } from \"@plasius/gpu-debug\";\nimport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n} from \"@plasius/gpu-physics/browser\";\n\nimport { loadGltfModel } from \"./gltf-loader.js\";\n\nconst STYLE_ID = \"plasius-shared-3d-showcase-style\";\nconst DEFAULT_TITLE = \"Flag by the Sea\";\nconst DEFAULT_SUBTITLE =\n \"Shared 3D validation scene using GLTF ships, cloth, fluid continuity, adaptive performance, and telemetry.\";\nconst CAMERA_PRESETS = Object.freeze({\n integrated: Object.freeze({ yaw: -0.55, pitch: 0.34, distance: 27, target: [0, 2.2, 0] }),\n lighting: Object.freeze({ yaw: -0.28, pitch: 0.28, distance: 23, target: [0, 2.8, 0] }),\n cloth: Object.freeze({ yaw: -1.1, pitch: 0.25, distance: 15, target: [-8.4, 5.3, -1.5] }),\n fluid: Object.freeze({ yaw: -0.4, pitch: 0.18, distance: 18, target: [0, 1.2, 6] }),\n physics: Object.freeze({ yaw: -0.12, pitch: 0.27, distance: 16, target: [0, 1.8, 6.8] }),\n performance: Object.freeze({ yaw: -0.65, pitch: 0.36, distance: 24, target: [0, 2.2, 0] }),\n debug: Object.freeze({ yaw: -0.7, pitch: 0.32, distance: 24, target: [0, 2.2, 0] }),\n});\nexport const showcaseFocusModes = Object.freeze(Object.keys(CAMERA_PRESETS));\n\nconst SCENE_NOTES = Object.freeze([\n \"Ships are loaded from a GLTF asset and carry physics metadata from node extras.\",\n \"Near-field lighting uses the ray-traced-primary shadow and reflection path before stepping down by distance band.\",\n \"Cloth and fluid continuity stay coherent across near, mid, far, and horizon bands.\",\n \"Performance pressure reduces visual detail before authoritative collision motion is touched.\",\n]);\n\nconst UNIT_BOX_MESH = Object.freeze({\n positions: Object.freeze([\n -0.5, -0.5, -0.5,\n 0.5, -0.5, -0.5,\n 0.5, 0.5, -0.5,\n -0.5, 0.5, -0.5,\n -0.5, -0.5, 0.5,\n 0.5, -0.5, 0.5,\n 0.5, 0.5, 0.5,\n -0.5, 0.5, 0.5,\n ]),\n indices: Object.freeze([\n 0, 1, 2, 0, 2, 3,\n 5, 4, 7, 5, 7, 6,\n 4, 0, 3, 4, 3, 7,\n 1, 5, 6, 1, 6, 2,\n 3, 2, 6, 3, 6, 7,\n 4, 5, 1, 4, 1, 0,\n ]),\n});\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n}\n\nfunction injectStyles() {\n if (document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n :root {\n color-scheme: light;\n --plasius-paper: #f4f7f8;\n --plasius-ink: #152028;\n --plasius-muted: #5c6f7b;\n --plasius-accent: #8f5634;\n --plasius-panel: rgba(255, 255, 255, 0.82);\n --plasius-border: rgba(21, 32, 40, 0.12);\n --plasius-shadow: 0 20px 48px rgba(15, 24, 31, 0.16);\n }\n * {\n box-sizing: border-box;\n }\n body {\n margin: 0;\n min-height: 100vh;\n font-family: \"Fraunces\", \"Iowan Old Style\", serif;\n color: var(--plasius-ink);\n background:\n radial-gradient(circle at top left, rgba(255, 247, 238, 0.92), transparent 34%),\n linear-gradient(180deg, #f6f8fb 0%, #d2dee6 48%, #b6c4ce 100%);\n }\n .plasius-demo {\n width: min(1560px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 40px;\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero,\n .plasius-demo__layout {\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero {\n grid-template-columns: minmax(0, 1.5fr) minmax(320px, 0.85fr);\n align-items: start;\n }\n .plasius-panel {\n border: 1px solid var(--plasius-border);\n border-radius: 24px;\n background: var(--plasius-panel);\n box-shadow: var(--plasius-shadow);\n backdrop-filter: blur(12px);\n }\n .plasius-demo__hero-card,\n .plasius-demo__status {\n padding: 20px 22px;\n }\n .plasius-demo__eyebrow {\n margin: 0 0 8px;\n text-transform: uppercase;\n letter-spacing: 0.18em;\n font-size: 12px;\n color: rgba(21, 32, 40, 0.56);\n }\n .plasius-demo h1,\n .plasius-demo h2,\n .plasius-demo h3 {\n margin: 0;\n }\n .plasius-demo__lead {\n margin: 12px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n max-width: 760px;\n }\n .plasius-demo__status-badge {\n width: fit-content;\n margin: 0;\n padding: 8px 12px;\n border-radius: 999px;\n background: rgba(143, 86, 52, 0.12);\n color: var(--plasius-accent);\n font-weight: 700;\n }\n .plasius-demo__status-text {\n margin: 10px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n }\n .plasius-demo__layout {\n grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.68fr);\n align-items: start;\n }\n .plasius-demo__canvas-panel {\n padding: 18px;\n position: relative;\n }\n .plasius-demo__canvas {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: block;\n border-radius: 20px;\n border: 1px solid rgba(21, 32, 40, 0.08);\n background: linear-gradient(180deg, #dce8ef 0%, #a9bfd0 42%, #0f5168 42%, #092433 100%);\n }\n .plasius-demo__toolbar {\n position: absolute;\n top: 26px;\n left: 26px;\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n }\n .plasius-demo button,\n .plasius-demo label,\n .plasius-demo select {\n font-family: \"JetBrains Mono\", monospace;\n font-size: 13px;\n }\n .plasius-demo button,\n .plasius-demo .plasius-toggle,\n .plasius-demo select {\n border: 1px solid rgba(21, 32, 40, 0.12);\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.84);\n color: var(--plasius-ink);\n padding: 10px 14px;\n }\n .plasius-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .plasius-demo__sidebar {\n display: grid;\n gap: 18px;\n }\n .plasius-demo__card {\n padding: 18px;\n }\n .plasius-demo__metrics,\n .plasius-demo__metrics li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .plasius-demo__metrics {\n margin-top: 12px;\n display: grid;\n gap: 8px;\n color: var(--plasius-muted);\n line-height: 1.55;\n }\n .plasius-demo__metrics li {\n border-top: 1px solid rgba(21, 32, 40, 0.08);\n padding-top: 8px;\n }\n .plasius-demo__legend {\n position: absolute;\n right: 24px;\n bottom: 24px;\n padding: 10px 14px;\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.84);\n border: 1px solid rgba(21, 32, 40, 0.1);\n color: var(--plasius-muted);\n font-size: 12px;\n line-height: 1.45;\n }\n .plasius-demo__legend strong {\n display: block;\n color: var(--plasius-ink);\n margin-bottom: 4px;\n }\n .plasius-demo__footer {\n margin-top: 4px;\n color: rgba(21, 32, 40, 0.66);\n font-size: 13px;\n line-height: 1.6;\n }\n @media (max-width: 1200px) {\n .plasius-demo__hero,\n .plasius-demo__layout {\n grid-template-columns: 1fr;\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction mix(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction vec3(x = 0, y = 0, z = 0) {\n return { x, y, z };\n}\n\nfunction addVec3(a, b) {\n return vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\nfunction subVec3(a, b) {\n return vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction scaleVec3(a, s) {\n return vec3(a.x * s, a.y * s, a.z * s);\n}\n\nfunction dotVec3(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nfunction crossVec3(a, b) {\n return vec3(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x\n );\n}\n\nfunction lengthVec3(a) {\n return Math.hypot(a.x, a.y, a.z);\n}\n\nfunction normalizeVec3(a) {\n const length = lengthVec3(a) || 1;\n return vec3(a.x / length, a.y / length, a.z / length);\n}\n\nfunction reflectVec3(vector, normal) {\n const unitNormal = normalizeVec3(normal);\n return subVec3(vector, scaleVec3(unitNormal, 2 * dotVec3(vector, unitNormal)));\n}\n\nfunction rotateY(point, angle) {\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n return vec3(\n point.x * cosine - point.z * sine,\n point.y,\n point.x * sine + point.z * cosine\n );\n}\n\nfunction transformPoint(point, transform) {\n const scale =\n typeof transform.scale === \"number\"\n ? { x: transform.scale, y: transform.scale, z: transform.scale }\n : transform.scale;\n const scaled = vec3(point.x * scale.x, point.y * scale.y, point.z * scale.z);\n const rotated = rotateY(scaled, transform.rotationY);\n return addVec3(rotated, transform.position);\n}\n\nfunction projectPoint(point, camera, viewport) {\n const relative = subVec3(point, camera.eye);\n const viewX = dotVec3(relative, camera.right);\n const viewY = dotVec3(relative, camera.up);\n const viewZ = dotVec3(relative, camera.forward);\n if (viewZ <= 0.1) {\n return null;\n }\n const focal = 1 / Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (viewX * focal) / (viewZ * camera.aspect);\n const ndcY = (viewY * focal) / viewZ;\n return {\n x: (ndcX * 0.5 + 0.5) * viewport.width,\n y: (-ndcY * 0.5 + 0.5) * viewport.height,\n depth: viewZ,\n };\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const r = Math.round(clamp(color.r, 0, 1) * 255);\n const g = Math.round(clamp(color.g, 0, 1) * 255);\n const b = Math.round(clamp(color.b, 0, 1) * 255);\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction projectShadowPoint(point, lightDir, planeY) {\n const shadowDir = scaleVec3(lightDir, -1);\n if (Math.abs(shadowDir.y) < 0.0001) {\n return null;\n }\n\n const distance = (planeY - point.y) / shadowDir.y;\n if (!Number.isFinite(distance) || distance < 0) {\n return null;\n }\n\n return addVec3(point, scaleVec3(shadowDir, distance));\n}\n\nfunction shadeColor(base, normal, lightDir, heightBias = 0, accent = 0) {\n const diffuse = clamp(dotVec3(normalizeVec3(normal), lightDir), 0, 1);\n const brightness = 0.24 + diffuse * 0.72 + heightBias * 0.08 + accent;\n return {\n r: clamp(base.r * brightness, 0, 1),\n g: clamp(base.g * brightness, 0, 1),\n b: clamp(base.b * (brightness + 0.03), 0, 1),\n };\n}\n\nfunction buildCamera(state, canvas) {\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const yaw = state.camera.yaw ?? preset.yaw;\n const pitch = state.camera.pitch ?? preset.pitch;\n const distance = state.camera.distance ?? preset.distance;\n const target = state.camera.target ?? vec3(...preset.target);\n const eye = vec3(\n target.x + Math.sin(yaw) * Math.cos(pitch) * distance,\n target.y + Math.sin(pitch) * distance,\n target.z + Math.cos(yaw) * Math.cos(pitch) * distance\n );\n const forward = normalizeVec3(subVec3(target, eye));\n const right = normalizeVec3(crossVec3(forward, vec3(0, 1, 0)));\n const up = normalizeVec3(crossVec3(right, forward));\n return {\n eye,\n target,\n forward,\n right,\n up,\n fov: 54,\n aspect: canvas.width / canvas.height,\n };\n}\n\nfunction buildTrianglesFromMesh(mesh, transform, baseColor, camera, viewport, triangles, accent = 0) {\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const aIndex = mesh.indices[index] * 3;\n const bIndex = mesh.indices[index + 1] * 3;\n const cIndex = mesh.indices[index + 2] * 3;\n\n const a = transformPoint(\n vec3(mesh.positions[aIndex], mesh.positions[aIndex + 1], mesh.positions[aIndex + 2]),\n transform\n );\n const b = transformPoint(\n vec3(mesh.positions[bIndex], mesh.positions[bIndex + 1], mesh.positions[bIndex + 2]),\n transform\n );\n const c = transformPoint(\n vec3(mesh.positions[cIndex], mesh.positions[cIndex + 1], mesh.positions[cIndex + 2]),\n transform\n );\n\n const ab = subVec3(b, a);\n const ac = subVec3(c, a);\n const normal = normalizeVec3(crossVec3(ab, ac));\n const viewDir = normalizeVec3(subVec3(camera.eye, a));\n if (dotVec3(normal, viewDir) <= 0) {\n continue;\n }\n\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor,\n accent,\n });\n }\n}\n\nfunction createPerformanceGovernor() {\n const fluidDetail = createQualityLadderAdapter({\n id: \"fluid-detail\",\n domain: \"geometry\",\n levels: [\n { id: \"low\", config: { nearResolution: 10, midResolution: 6, splashCount: 10 }, estimatedCostMs: 0.8 },\n { id: \"medium\", config: { nearResolution: 16, midResolution: 8, splashCount: 18 }, estimatedCostMs: 1.4 },\n { id: \"high\", config: { nearResolution: 24, midResolution: 12, splashCount: 28 }, estimatedCostMs: 2.4 },\n ],\n initialLevel: \"high\",\n });\n\n const clothDetail = createQualityLadderAdapter({\n id: \"cloth-detail\",\n domain: \"cloth\",\n levels: [\n { id: \"low\", config: { cols: 10, rows: 7 }, estimatedCostMs: 0.7 },\n { id: \"medium\", config: { cols: 16, rows: 11 }, estimatedCostMs: 1.3 },\n { id: \"high\", config: { cols: 24, rows: 16 }, estimatedCostMs: 2.1 },\n ],\n initialLevel: \"high\",\n });\n\n const lightingDetail = createQualityLadderAdapter({\n id: \"lighting-detail\",\n domain: \"lighting\",\n levels: [\n { id: \"low\", config: { shadowStrength: 0.18, reflectionStrength: 0.08 }, estimatedCostMs: 0.5 },\n { id: \"medium\", config: { shadowStrength: 0.34, reflectionStrength: 0.16 }, estimatedCostMs: 1.0 },\n { id: \"high\", config: { shadowStrength: 0.5, reflectionStrength: 0.24 }, estimatedCostMs: 1.8 },\n ],\n initialLevel: \"high\",\n });\n\n const governor = createGpuPerformanceGovernor({\n device: createDeviceProfile({\n deviceClass: \"desktop\",\n mode: \"flat\",\n refreshRateHz: 60,\n supportedFrameRates: [60, 90],\n supportsWebGpu: true,\n }),\n modules: [fluidDetail, clothDetail, lightingDetail],\n adaptation: {\n sampleWindowSize: 10,\n minimumSamplesBeforeAdjustment: 4,\n degradeCooldownFrames: 1,\n upgradeCooldownFrames: 4,\n minStableFramesForRecovery: 3,\n },\n });\n\n return { governor, fluidDetail, clothDetail, lightingDetail };\n}\n\nfunction buildDemoDom(root, options) {\n root.innerHTML = `\n <main class=\"plasius-demo\">\n <section class=\"plasius-demo__hero\">\n <section class=\"plasius-panel plasius-demo__hero-card\">\n <p class=\"plasius-demo__eyebrow\">${options.packageName}</p>\n <h1>${options.title}</h1>\n <p class=\"plasius-demo__lead\">${options.subtitle}</p>\n </section>\n <section class=\"plasius-panel plasius-demo__status\">\n <p id=\"demoStatus\" class=\"plasius-demo__status-badge\">Booting 3D scene…</p>\n <p id=\"demoDetails\" class=\"plasius-demo__status-text\">\n Preparing GLTF assets, cloth and fluid continuity plans, and adaptive quality metadata.\n </p>\n </section>\n </section>\n <section class=\"plasius-demo__layout\">\n <section class=\"plasius-panel plasius-demo__canvas-panel\">\n <canvas id=\"demoCanvas\" class=\"plasius-demo__canvas\" width=\"1280\" height=\"720\"></canvas>\n <div class=\"plasius-demo__toolbar\">\n <button id=\"pauseButton\" type=\"button\">Pause</button>\n <label class=\"plasius-toggle\">\n <input id=\"stressToggle\" type=\"checkbox\" />\n Stress mode\n </label>\n <label class=\"plasius-toggle\">\n Focus\n <select id=\"focusMode\">\n <option value=\"integrated\">integrated</option>\n <option value=\"lighting\">lighting</option>\n <option value=\"cloth\">cloth</option>\n <option value=\"fluid\">fluid</option>\n <option value=\"physics\">physics</option>\n <option value=\"performance\">performance</option>\n <option value=\"debug\">debug</option>\n </select>\n </label>\n </div>\n <div class=\"plasius-demo__legend\">\n <strong>Scene</strong>\n GLTF ships carry collision metadata.<br />\n Flag cloth and ocean waves scale by distance band.<br />\n Ray-traced shadow and reflection style is preserved near the camera.\n </div>\n </section>\n <aside class=\"plasius-demo__sidebar\">\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Scene State</h2>\n <ul id=\"sceneMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Quality + Budgets</h2>\n <ul id=\"qualityMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Debug Telemetry</h2>\n <ul id=\"debugMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Notes</h2>\n <ul id=\"sceneNotes\" class=\"plasius-demo__metrics\"></ul>\n </section>\n </aside>\n </section>\n <p class=\"plasius-demo__footer\">\n This visual example is shared across the GPU packages to keep manual validation fast and consistent.\n </p>\n </main>\n `;\n\n return {\n status: root.querySelector(\"#demoStatus\"),\n details: root.querySelector(\"#demoDetails\"),\n canvas: root.querySelector(\"#demoCanvas\"),\n pauseButton: root.querySelector(\"#pauseButton\"),\n stressToggle: root.querySelector(\"#stressToggle\"),\n focusMode: root.querySelector(\"#focusMode\"),\n sceneMetrics: root.querySelector(\"#sceneMetrics\"),\n qualityMetrics: root.querySelector(\"#qualityMetrics\"),\n debugMetrics: root.querySelector(\"#debugMetrics\"),\n sceneNotes: root.querySelector(\"#sceneNotes\"),\n };\n}\n\nfunction buildSceneSnapshot(state, shipModel) {\n return Object.freeze({\n focus: state.focus,\n frame: state.frame,\n time: state.time,\n stress: state.stress,\n collisions: state.contactCount,\n collisionCount: state.collisionCount,\n collisionFlash: state.collisionFlash,\n sprays: Object.freeze(\n state.sprays.map((spray) =>\n Object.freeze({\n life: spray.life,\n position: Object.freeze({ ...spray.position }),\n velocity: Object.freeze({ ...spray.velocity }),\n })\n )\n ),\n ships: Object.freeze(\n state.ships.map((ship) =>\n Object.freeze({\n id: ship.id,\n position: Object.freeze({ ...ship.position }),\n velocity: Object.freeze({ ...ship.velocity }),\n rotationY: ship.rotationY,\n angularVelocity: ship.angularVelocity,\n tint: Object.freeze({ ...ship.tint }),\n })\n )\n ),\n waveImpulses: Object.freeze(\n state.waveImpulses.map((impulse) =>\n Object.freeze({\n x: impulse.x,\n z: impulse.z,\n strength: impulse.strength,\n radius: impulse.radius,\n life: impulse.life,\n })\n )\n ),\n physics: Object.freeze({\n profile: state.physics.profile,\n plan: state.physics.plan,\n manifest: state.physics.manifest,\n snapshot: state.physics.snapshot,\n shipPhysics: shipModel?.physics ?? null,\n }),\n });\n}\n\nfunction resolveSceneDescription(state, options, shipModel) {\n const scene = buildSceneSnapshot(state, shipModel);\n if (typeof options.describeState !== \"function\") {\n return { scene, description: null };\n }\n\n const description = options.describeState(state.packageState, scene) ?? null;\n return { scene, description };\n}\n\nfunction updatePackageState(state, options, shipModel, dt) {\n if (typeof options.updateState !== \"function\") {\n return;\n }\n\n const scene = buildSceneSnapshot(state, shipModel);\n const nextState = options.updateState(state.packageState, scene, dt);\n if (typeof nextState !== \"undefined\") {\n state.packageState = nextState;\n }\n}\n\nfunction normalizeColorOverride(color, fallback) {\n if (!color || typeof color !== \"object\") {\n return fallback;\n }\n\n return {\n r: typeof color.r === \"number\" ? color.r : fallback.r,\n g: typeof color.g === \"number\" ? color.g : fallback.g,\n b: typeof color.b === \"number\" ? color.b : fallback.b,\n };\n}\n\nfunction readVisualNumber(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction resolveVisualConfig(nearLighting, lightingSnapshot, customVisuals = {}) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const defaults = {\n skyTop: premiumShadows ? \"#f0f7fb\" : \"#e8f1f7\",\n skyMid: premiumShadows ? \"#c7d9e5\" : \"#b9ceda\",\n skyBottom: premiumShadows ? \"#84a7bd\" : \"#7b9bb0\",\n seaTop: premiumShadows ? \"#235064\" : \"#264c5f\",\n seaMid: premiumShadows ? \"#153e53\" : \"#173d4f\",\n seaBottom: \"#0b2433\",\n sunCore: \"rgba(255, 244, 210, 0.9)\",\n reflectionStrength: lightingSnapshot.currentLevel.config.reflectionStrength,\n shadowAccent: lightingSnapshot.currentLevel.config.shadowStrength,\n waveAmplitude: 1,\n waveDirection: { x: 0.86, z: 0.34 },\n wavePhaseSpeed: 1,\n wakeStrength: 0.24,\n wakeLength: 15,\n collisionRippleStrength: 0.34,\n waterNear: { r: 0.12, g: 0.36, b: 0.46 },\n waterFar: { r: 0.28, g: 0.56, b: 0.68 },\n harborWall: { r: 0.48, g: 0.4, b: 0.32 },\n harborDeck: { r: 0.5, g: 0.34, b: 0.22 },\n harborTower: { r: 0.34, g: 0.32, b: 0.36 },\n flagColor: { r: 0.76, g: 0.24, b: 0.18 },\n flagMotion: 1,\n };\n\n return {\n skyTop: typeof customVisuals.skyTop === \"string\" ? customVisuals.skyTop : defaults.skyTop,\n skyMid: typeof customVisuals.skyMid === \"string\" ? customVisuals.skyMid : defaults.skyMid,\n skyBottom:\n typeof customVisuals.skyBottom === \"string\" ? customVisuals.skyBottom : defaults.skyBottom,\n seaTop: typeof customVisuals.seaTop === \"string\" ? customVisuals.seaTop : defaults.seaTop,\n seaMid: typeof customVisuals.seaMid === \"string\" ? customVisuals.seaMid : defaults.seaMid,\n seaBottom:\n typeof customVisuals.seaBottom === \"string\" ? customVisuals.seaBottom : defaults.seaBottom,\n sunCore:\n typeof customVisuals.sunCore === \"string\" ? customVisuals.sunCore : defaults.sunCore,\n reflectionStrength: readVisualNumber(\n customVisuals.reflectionStrength,\n defaults.reflectionStrength\n ),\n shadowAccent: readVisualNumber(customVisuals.shadowAccent, defaults.shadowAccent),\n waveAmplitude: readVisualNumber(customVisuals.waveAmplitude, defaults.waveAmplitude),\n waveDirection:\n customVisuals.waveDirection &&\n typeof customVisuals.waveDirection.x === \"number\" &&\n typeof customVisuals.waveDirection.z === \"number\"\n ? { x: customVisuals.waveDirection.x, z: customVisuals.waveDirection.z }\n : defaults.waveDirection,\n wavePhaseSpeed: readVisualNumber(customVisuals.wavePhaseSpeed, defaults.wavePhaseSpeed),\n wakeStrength: readVisualNumber(customVisuals.wakeStrength, defaults.wakeStrength),\n wakeLength: readVisualNumber(customVisuals.wakeLength, defaults.wakeLength),\n collisionRippleStrength: readVisualNumber(\n customVisuals.collisionRippleStrength,\n defaults.collisionRippleStrength\n ),\n waterNear: normalizeColorOverride(customVisuals.waterNear, defaults.waterNear),\n waterFar: normalizeColorOverride(customVisuals.waterFar, defaults.waterFar),\n harborWall: normalizeColorOverride(customVisuals.harborWall, defaults.harborWall),\n harborDeck: normalizeColorOverride(customVisuals.harborDeck, defaults.harborDeck),\n harborTower: normalizeColorOverride(customVisuals.harborTower, defaults.harborTower),\n flagColor: normalizeColorOverride(customVisuals.flagColor, defaults.flagColor),\n flagMotion: readVisualNumber(customVisuals.flagMotion, defaults.flagMotion),\n };\n}\n\nfunction buildClothSurface(model, state, meshDetail, visuals) {\n const clothPlan = createClothRepresentationPlan({\n garmentId: \"shore-flag\",\n kind: state.focus === \"cloth\" ? \"flag\" : clothGarmentKinds[0],\n profile: state.focus === \"cloth\" ? \"cinematic\" : clothProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 18,\n midFieldMaxMeters: 55,\n farFieldMaxMeters: 180,\n });\n const cameraDistance = lengthVec3(subVec3(state.camera.target, state.camera.eye ?? vec3(...CAMERA_PRESETS[state.focus].target)));\n const band = selectClothRepresentationBand(cameraDistance, clothPlan.thresholds);\n const representation =\n clothPlan.representations.find((entry) => entry.band === band) ?? clothPlan.representations[0];\n const continuity = createClothContinuityEnvelope({ garmentId: \"shore-flag\" });\n\n const cols = meshDetail.cols;\n const rows = meshDetail.rows;\n const origin = vec3(-3.5, 5.9, 2.4);\n const width = 4.8;\n const height = 2.7;\n const positions = [];\n const indices = [];\n const time = state.time;\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const gust =\n Math.sin(time * 1.9 + v * 3.2 + u * 2.1) *\n continuity.broadMotionFloor *\n visuals.flagMotion;\n const wrinkle =\n Math.sin(time * 4.4 + u * 9.2 + v * 5.6) *\n continuity.wrinkleFloor *\n 0.22 *\n Math.max(0.55, visuals.flagMotion);\n const x = origin.x + u * 1.8 + gust * 0.55 * (u * 0.9);\n const y = origin.y - height * v + wrinkle * 0.2;\n const z = origin.z + width * u + gust * 0.72 * (u * 0.85);\n const flap =\n Math.cos(time * 2.7 + u * 7.4 + v * 3.8) *\n continuity.broadMotionFloor *\n 0.28 *\n visuals.flagMotion;\n positions.push(vec3(x + flap, y, z));\n }\n }\n\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n return {\n clothPlan,\n band,\n representation,\n continuity,\n color: visuals.flagColor,\n positions,\n indices,\n grid: { rows, cols },\n };\n}\n\nfunction resolveWaveDirection(state) {\n const direction = state.demoVisuals?.waveDirection;\n if (\n direction &&\n typeof direction === \"object\" &&\n typeof direction.x === \"number\" &&\n typeof direction.z === \"number\"\n ) {\n return normalizeVec3(vec3(direction.x, 0, direction.z));\n }\n\n return normalizeVec3(vec3(0.86, 0, 0.34));\n}\n\nfunction sampleShipWake(state, x, z, time) {\n const wakeStrength = readVisualNumber(state.demoVisuals?.wakeStrength, 0.24);\n const wakeLength = readVisualNumber(state.demoVisuals?.wakeLength, 15);\n let total = 0;\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.05) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const delta = vec3(x - ship.position.x, 0, z - ship.position.z);\n const along = dotVec3(delta, behind);\n if (along < 0 || along > wakeLength) {\n continue;\n }\n\n const cross = Math.abs(dotVec3(delta, lateral));\n const width = 0.9 + along * 0.2;\n if (cross > width * 3.2) {\n continue;\n }\n\n const envelope =\n Math.exp(-along * 0.14) * Math.exp(-((cross * cross) / Math.max(0.4, width * width * 2.4)));\n total += Math.sin(along * 1.6 - time * 4.2) * speed * wakeStrength * envelope;\n }\n\n return total;\n}\n\nfunction sampleWaveImpulses(state, x, z, time) {\n const rippleStrength = readVisualNumber(state.demoVisuals?.collisionRippleStrength, 0.34);\n let total = 0;\n\n for (const impulse of state.waveImpulses) {\n const dx = x - impulse.x;\n const dz = z - impulse.z;\n const distance = Math.hypot(dx, dz);\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n if (distance > radius * 2.8) {\n continue;\n }\n\n const phase = distance * 1.8 - (1 - impulse.life) * 10 - time * 0.4;\n const envelope = Math.exp(-distance / Math.max(0.1, radius)) * impulse.life;\n total += Math.sin(phase) * impulse.strength * rippleStrength * envelope * 0.18;\n }\n\n return total;\n}\n\nfunction sampleWave(state, x, z, time) {\n const direction = resolveWaveDirection(state);\n const lateral = vec3(-direction.z, 0, direction.x);\n const along = x * direction.x + z * direction.z;\n const cross = x * lateral.x + z * lateral.z;\n const phaseSpeed = readVisualNumber(state.demoVisuals?.wavePhaseSpeed, 1);\n const amplitude = readVisualNumber(state.demoVisuals?.waveAmplitude, 1);\n const base =\n Math.sin(along * 0.22 - time * 1.12 * phaseSpeed) * 0.42 +\n Math.cos(along * 0.11 + cross * 0.07 - time * 0.78 * phaseSpeed) * 0.26 +\n Math.sin(cross * 0.19 - time * 1.34 * phaseSpeed) * 0.16;\n\n return (\n base * amplitude +\n sampleShipWake(state, x, z, time) +\n sampleWaveImpulses(state, x, z, time)\n );\n}\n\nfunction buildWaterBands(state, fluidDetail, visuals) {\n const fluidPlan = createFluidRepresentationPlan({\n fluidBodyId: \"harbor\",\n kind: state.focus === \"fluid\" ? \"ocean\" : fluidBodyKinds[0],\n profile: state.focus === \"fluid\" ? \"cinematic\" : fluidProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 40,\n midFieldMaxMeters: 150,\n farFieldMaxMeters: 600,\n });\n\n const bandMeshes = [];\n const bandExtents = Object.freeze([\n { band: \"near\", width: 20, depth: 18, step: 1, y: 0.2 },\n { band: \"mid\", width: 34, depth: 28, step: 2, y: 0.05 },\n { band: \"far\", width: 54, depth: 42, step: 3.5, y: -0.05 },\n { band: \"horizon\", width: 80, depth: 76, step: 7, y: -0.14 },\n ]);\n\n for (const bandSpec of bandExtents) {\n const representation =\n fluidPlan.representations.find((entry) => entry.band === bandSpec.band) ??\n fluidPlan.representations[0];\n const continuity = createFluidContinuityEnvelope({ fluidBodyId: \"harbor\" });\n const bandResolution =\n bandSpec.band === \"near\"\n ? fluidDetail.nearResolution\n : bandSpec.band === \"mid\"\n ? fluidDetail.midResolution\n : bandSpec.band === \"far\"\n ? 5\n : 3;\n const cols = Math.max(4, bandResolution * 2);\n const rows = Math.max(4, bandResolution + 2);\n const positions = [];\n const indices = [];\n const originX = -bandSpec.width * 0.5;\n const originZ = -6;\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const x = originX + bandSpec.width * u;\n const z = originZ + bandSpec.depth * v;\n const y =\n bandSpec.y +\n sampleWave(state, x, z, state.time) *\n continuity.amplitudeFloor *\n (bandSpec.band === \"near\" ? 0.9 : bandSpec.band === \"mid\" ? 0.55 : 0.3);\n positions.push(vec3(x, y, z));\n }\n }\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n bandMeshes.push({\n band: bandSpec.band,\n representation,\n continuity,\n rows,\n cols,\n positions,\n indices,\n color:\n bandSpec.band === \"near\"\n ? visuals.waterNear\n : bandSpec.band === \"mid\"\n ? {\n r: mix(visuals.waterNear.r, visuals.waterFar.r, 0.4),\n g: mix(visuals.waterNear.g, visuals.waterFar.g, 0.4),\n b: mix(visuals.waterNear.b, visuals.waterFar.b, 0.4),\n }\n : bandSpec.band === \"far\"\n ? visuals.waterFar\n : {\n r: mix(visuals.waterFar.r, 0.76, 0.2),\n g: mix(visuals.waterFar.g, 0.78, 0.2),\n b: mix(visuals.waterFar.b, 0.82, 0.2),\n },\n });\n }\n\n return { fluidPlan, bandMeshes };\n}\n\nfunction createSceneState(options) {\n const { governor, fluidDetail, clothDetail, lightingDetail } = createPerformanceGovernor();\n const physicsProfile = defaultPhysicsWorkerProfile;\n const physicsPlan = createPhysicsSimulationPlan(physicsProfile);\n const physicsManifest = getPhysicsWorkerManifest(physicsProfile);\n const debugSession = createGpuDebugSession({\n enabled: true,\n adapter: {\n label: \"3D showcase\",\n memoryCapacityHintBytes: 6 * 1024 * 1024 * 1024,\n coreCountHint: 12,\n },\n });\n debugSession.trackAllocation({\n id: \"showcase.color\",\n owner: \"renderer\",\n category: \"texture\",\n sizeBytes: 1280 * 720 * 4,\n label: \"Main color buffer\",\n });\n debugSession.trackAllocation({\n id: \"showcase.shadow-impression\",\n owner: \"lighting\",\n category: \"texture\",\n sizeBytes: 12 * 1024 * 1024,\n label: \"Shadow impression atlas\",\n });\n\n return {\n focus: options.focus,\n governor,\n fluidDetail,\n clothDetail,\n lightingDetail,\n debugSession,\n packageState: undefined,\n demoDescription: null,\n demoVisuals: null,\n time: 0,\n lastTimeMs: null,\n paused: false,\n stress: false,\n camera: {\n ...CAMERA_PRESETS[options.focus],\n target: vec3(...CAMERA_PRESETS[options.focus].target),\n },\n ships: [\n {\n id: \"northwind\",\n position: vec3(-5.2, 0, 7.2),\n velocity: vec3(2.1, 0, -1.6),\n rotationY: 0.42,\n angularVelocity: 0.18,\n tint: { r: 0.62, g: 0.39, b: 0.23 },\n },\n {\n id: \"tidecaller\",\n position: vec3(4.8, 0, 4.4),\n velocity: vec3(-1.85, 0, 1.25),\n rotationY: -2.62,\n angularVelocity: -0.14,\n tint: { r: 0.48, g: 0.28, b: 0.19 },\n },\n ],\n sprays: [],\n waveImpulses: [],\n frame: 0,\n contactCount: 0,\n collisionCount: 0,\n collisionFlash: 0,\n physics: {\n profile: physicsProfile,\n plan: physicsPlan,\n manifest: physicsManifest,\n snapshot: null,\n },\n shipModel: null,\n };\n}\n\nfunction setListContent(element, values) {\n element.innerHTML = values.map((value) => `<li>${value}</li>`).join(\"\");\n}\n\nfunction drawSkyAndShore(ctx, canvas, state, nearLighting, reflectionStrength, shadowStrength, visuals) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const sky = ctx.createLinearGradient(0, 0, 0, canvas.height * 0.5);\n sky.addColorStop(0, visuals.skyTop);\n sky.addColorStop(0.6, visuals.skyMid);\n sky.addColorStop(1, visuals.skyBottom);\n ctx.fillStyle = sky;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const shoreline = ctx.createLinearGradient(0, canvas.height * 0.45, 0, canvas.height);\n shoreline.addColorStop(0, visuals.seaTop);\n shoreline.addColorStop(0.52, visuals.seaMid);\n shoreline.addColorStop(1, visuals.seaBottom);\n ctx.fillStyle = shoreline;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n const sunX = mix(canvas.width * 0.16, canvas.width * 0.84, (Math.sin(state.time * 0.12) + 1) * 0.5);\n const sunY = canvas.height * 0.14 + Math.cos(state.time * 0.12) * 22;\n const sun = ctx.createRadialGradient(sunX, sunY, 10, sunX, sunY, 90);\n sun.addColorStop(0, visuals.sunCore);\n sun.addColorStop(1, \"rgba(255, 244, 210, 0)\");\n ctx.fillStyle = sun;\n ctx.beginPath();\n ctx.arc(sunX, sunY, 90, 0, Math.PI * 2);\n ctx.fill();\n\n const track = ctx.createLinearGradient(sunX, canvas.height * 0.46, sunX, canvas.height * 0.96);\n track.addColorStop(0, `rgba(255, 243, 214, ${0.08 + reflectionStrength * 0.18})`);\n track.addColorStop(0.42, `rgba(224, 242, 255, ${0.04 + reflectionStrength * 0.2})`);\n track.addColorStop(1, \"rgba(224, 242, 255, 0)\");\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = track;\n ctx.beginPath();\n ctx.ellipse(sunX, canvas.height * 0.72, 46 + shadowStrength * 60, canvas.height * 0.26, 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n if (state.collisionFlash > 0.01) {\n ctx.fillStyle = `rgba(255, 243, 228, ${state.collisionFlash * 0.14})`;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n}\n\nfunction drawTriangles(ctx, triangles, lightDir, reflectionStrength, camera, shadowStrength) {\n triangles.sort((left, right) => right.depth - left.depth);\n for (const triangle of triangles) {\n const surfaceNormal = normalizeVec3(triangle.normal);\n const shaded = shadeColor(\n triangle.baseColor,\n surfaceNormal,\n lightDir,\n clamp((triangle.worldCenter.y + 3) / 10, 0, 1),\n triangle.accent\n );\n const reflection = triangle.worldCenter.y < 0.8 ? reflectionStrength : 0;\n const viewDir = normalizeVec3(subVec3(camera.eye, triangle.worldCenter));\n const reflectedLight = reflectVec3(scaleVec3(lightDir, -1), surfaceNormal);\n const gloss = triangle.worldCenter.y < 0.9 ? 1 : triangle.accent > 0.05 ? 0.55 : 0.3;\n const specular = Math.pow(clamp(dotVec3(reflectedLight, viewDir), 0, 1), triangle.worldCenter.y < 0.9 ? 18 : 12) * gloss;\n const occlusion = triangle.worldCenter.y < 0.9 ? shadowStrength * 0.035 : 0;\n const fill = colorToRgba(\n {\n r: clamp(shaded.r + reflection * 0.08 + specular * 0.14 - occlusion, 0, 1),\n g: clamp(shaded.g + reflection * 0.08 + specular * 0.15 - occlusion, 0, 1),\n b: clamp(shaded.b + reflection * 0.16 + specular * 0.2 - occlusion * 0.5, 0, 1),\n },\n 0.98\n );\n ctx.fillStyle = fill;\n ctx.beginPath();\n ctx.moveTo(triangle.points[0].x, triangle.points[0].y);\n ctx.lineTo(triangle.points[1].x, triangle.points[1].y);\n ctx.lineTo(triangle.points[2].x, triangle.points[2].y);\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction renderProjectedShadow(ctx, worldPoints, camera, viewport, lightDir, options = {}) {\n const planeY = options.planeY ?? 0;\n const projected = worldPoints\n .map((point) => projectShadowPoint(point, lightDir, planeY))\n .filter(Boolean)\n .map((point) => projectPoint(point, camera, viewport))\n .filter(Boolean);\n\n if (projected.length < 3) {\n return;\n }\n\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = options.color ?? `rgba(12, 24, 36, ${clamp(options.alpha ?? 0.16, 0, 0.5)})`;\n ctx.shadowColor = options.color ?? \"rgba(12, 24, 36, 0.22)\";\n ctx.shadowBlur = options.blur ?? 18;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].x, projected[index].y);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction pushHarborGeometry(camera, viewport, triangles, visuals) {\n const harborObjects = [\n {\n position: vec3(-8.2, 1.1, -0.9),\n rotationY: -0.16,\n scale: { x: 5.4, y: 2.4, z: 4.2 },\n color: visuals.harborWall,\n accent: 0.06,\n },\n {\n position: vec3(-5.7, 0.45, 1.4),\n rotationY: -0.08,\n scale: { x: 6.8, y: 0.3, z: 2.1 },\n color: visuals.harborDeck,\n accent: 0.04,\n },\n {\n position: vec3(-10.4, 0.28, 0.8),\n rotationY: 0.22,\n scale: { x: 1.2, y: 0.9, z: 1.2 },\n color: visuals.harborTower,\n accent: 0.02,\n },\n ];\n\n for (const object of harborObjects) {\n buildTrianglesFromMesh(\n UNIT_BOX_MESH,\n {\n position: object.position,\n rotationY: object.rotationY,\n scale: object.scale,\n },\n object.color,\n camera,\n viewport,\n triangles,\n object.accent\n );\n }\n}\n\nfunction renderShipRigging(ctx, ship, camera, viewport) {\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: 1.1 };\n const mastBase = transformPoint(vec3(0, 0.38, -0.4), transform);\n const mastTop = transformPoint(vec3(0, 3.8, -0.2), transform);\n const aftBase = transformPoint(vec3(-0.25, 0.32, -1.9), transform);\n const aftTop = transformPoint(vec3(-0.15, 2.7, -1.75), transform);\n const sailA = transformPoint(vec3(0.08, 3.2, -0.2), transform);\n const sailB = transformPoint(vec3(0.12, 1.2, -0.5), transform);\n const sailC = transformPoint(vec3(2.25, 2.25, 0.15), transform);\n const projected = [mastBase, mastTop, aftBase, aftTop, sailA, sailB, sailC].map((point) =>\n projectPoint(point, camera, viewport)\n );\n if (projected.some((value) => value === null)) {\n return;\n }\n\n ctx.strokeStyle = \"rgba(73, 54, 45, 0.94)\";\n ctx.lineWidth = 3.5;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n ctx.lineTo(projected[1].x, projected[1].y);\n ctx.moveTo(projected[2].x, projected[2].y);\n ctx.lineTo(projected[3].x, projected[3].y);\n ctx.stroke();\n\n ctx.fillStyle = \"rgba(238, 232, 214, 0.88)\";\n ctx.beginPath();\n ctx.moveTo(projected[4].x, projected[4].y);\n ctx.lineTo(projected[5].x, projected[5].y);\n ctx.lineTo(projected[6].x, projected[6].y);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction renderClothAccent(ctx, cloth, camera, viewport) {\n const projected = cloth.positions.map((point) => projectPoint(point, camera, viewport));\n ctx.strokeStyle = \"rgba(255, 241, 226, 0.92)\";\n ctx.lineWidth = 1.7;\n\n for (\n let row = 0;\n row < cloth.grid.rows;\n row += Math.max(1, Math.floor(cloth.grid.rows / 5))\n ) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < cloth.grid.cols; column += 1) {\n const point = projected[row * cloth.grid.cols + column];\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n\n const borderIndices = [\n 0,\n cloth.grid.cols - 1,\n cloth.grid.rows * cloth.grid.cols - 1,\n (cloth.grid.rows - 1) * cloth.grid.cols,\n ];\n ctx.fillStyle = colorToRgba(cloth.color, 0.95);\n for (const index of borderIndices) {\n const point = projected[index];\n if (!point) {\n continue;\n }\n ctx.beginPath();\n ctx.arc(point.x, point.y, 2.8, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderWaterHighlights(ctx, waterBands, camera, viewport) {\n for (const band of waterBands) {\n if (band.band === \"horizon\") {\n continue;\n }\n const interval = band.band === \"near\" ? 2 : 3;\n const alpha = band.band === \"near\" ? 0.22 : 0.14;\n ctx.strokeStyle = `rgba(232, 247, 255, ${alpha})`;\n ctx.lineWidth = band.band === \"near\" ? 1.3 : 0.9;\n for (let row = interval; row < band.rows - 1; row += interval) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < band.cols; column += 1) {\n const point = projectPoint(\n band.positions[row * band.cols + column],\n camera,\n viewport\n );\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n }\n}\n\nfunction spawnSpray(state, point, intensity) {\n const count = state.fluidDetail.getSnapshot().currentLevel.config.splashCount;\n for (let index = 0; index < count; index += 1) {\n const angle = (index / count) * Math.PI * 2;\n const speed = 0.9 + Math.random() * intensity * 0.45;\n state.sprays.push({\n position: vec3(point.x, point.y, point.z),\n velocity: vec3(Math.cos(angle) * speed * 0.35, 1.1 + Math.random() * 0.8, Math.sin(angle) * speed * 0.25),\n life: 1.2 + Math.random() * 0.4,\n });\n }\n}\n\nfunction updateShips(state, dt, shipModel) {\n const physics = shipModel.physics;\n const halfExtents = physics.halfExtents ?? [1.35, 0.95, 3.9];\n let collided = false;\n state.contactCount = 0;\n for (const ship of state.ships) {\n ship.position = addVec3(ship.position, scaleVec3(ship.velocity, dt));\n ship.rotationY += ship.angularVelocity * dt;\n ship.velocity = scaleVec3(ship.velocity, 1 - (physics.linearDamping ?? 0.04) * dt);\n ship.angularVelocity *= 1 - (physics.angularDamping ?? 0.08) * dt;\n ship.position.y =\n sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.22 +\n (physics.waterline ?? 0.42);\n if (Math.abs(ship.position.x) > 10) {\n ship.velocity.x *= -1;\n ship.angularVelocity *= -1;\n }\n if (ship.position.z < 2 || ship.position.z > 16) {\n ship.velocity.z *= -1;\n ship.angularVelocity *= -1;\n }\n }\n\n const [a, b] = state.ships;\n const dx = b.position.x - a.position.x;\n const dz = b.position.z - a.position.z;\n const overlapX = Math.abs(dx) < halfExtents[0] * 1.7;\n const overlapZ = Math.abs(dz) < halfExtents[2] * 0.8;\n if (overlapX && overlapZ) {\n const restitution = physics.restitution ?? 0.22;\n const swapX = a.velocity.x;\n const swapZ = a.velocity.z;\n a.velocity.x = -b.velocity.x * (0.86 + restitution);\n a.velocity.z = -b.velocity.z * (0.82 + restitution);\n b.velocity.x = -swapX * (0.86 + restitution);\n b.velocity.z = -swapZ * (0.82 + restitution);\n a.angularVelocity += 0.55;\n b.angularVelocity -= 0.55;\n const contactPoint = vec3((a.position.x + b.position.x) * 0.5, (a.position.y + b.position.y) * 0.5 + 0.1, (a.position.z + b.position.z) * 0.5);\n spawnSpray(state, contactPoint, Math.abs(dx) + Math.abs(dz));\n state.waveImpulses.push({\n x: contactPoint.x,\n z: contactPoint.z,\n strength: Math.min(1.4, 0.2 + (Math.abs(dx) + Math.abs(dz)) * 0.18),\n radius: 0.8,\n life: 1,\n });\n state.collisionCount += 1;\n state.contactCount = 1;\n collided = true;\n }\n state.collisionFlash = collided ? 1 : Math.max(0, state.collisionFlash - dt * 1.8);\n}\n\nfunction updateWaveImpulses(state, dt) {\n state.waveImpulses = state.waveImpulses\n .map((impulse) => ({\n ...impulse,\n life: impulse.life - dt * 0.55,\n }))\n .filter((impulse) => impulse.life > 0);\n}\n\nfunction updateSpray(state, dt) {\n state.sprays = state.sprays\n .map((particle) => {\n const nextVelocity = vec3(particle.velocity.x, particle.velocity.y - 4.2 * dt, particle.velocity.z);\n const nextPosition = addVec3(particle.position, scaleVec3(nextVelocity, dt));\n return {\n position: nextPosition,\n velocity: nextVelocity,\n life: particle.life - dt,\n };\n })\n .filter((particle) => particle.life > 0 && particle.position.y > -0.2);\n}\n\nfunction recordTelemetry(state, frameTimeMs) {\n const frameId = `showcase-${state.frame}`;\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: state.lightingDetail.getSnapshot(),\n };\n const synthetic = frameTimeMs + state.sprays.length * 0.1 + (state.stress ? 6.5 : 0);\n const decision = state.governor.recordFrame({ frameTimeMs: synthetic });\n const queueDepth = Math.min(32, Math.round(6 + state.sprays.length / 2 + (state.stress ? 10 : 0)));\n const readyLaneDepth = Math.min(\n 16,\n 4 + Math.round(Math.max(0, Math.sin(state.time * 1.7 + 0.8)) * 9)\n );\n state.debugSession.recordQueue({\n owner: \"renderer\",\n queueClass: \"render\",\n depth: queueDepth,\n capacity: 32,\n frameId,\n });\n state.debugSession.recordReadyLane({\n owner: \"lighting\",\n queueClass: \"lighting\",\n laneId: \"critical\",\n priority: 920,\n depth: readyLaneDepth,\n capacity: 16,\n frameId,\n });\n state.debugSession.recordDispatch({\n owner: \"lighting\",\n queueClass: \"lighting\",\n jobType: \"lighting.integration\",\n frameId,\n durationMs: quality.lighting.currentLevel.estimatedCostMs ?? 1.2,\n workgroups: { x: quality.fluid.currentLevel.config.nearResolution, y: 1, z: 1 },\n workgroupSize: { x: 8, y: 8, z: 1 },\n });\n state.debugSession.recordDependencyUnlock({\n owner: \"scene\",\n queueClass: \"render\",\n sourceJobType: \"physics.resolve\",\n unlockedJobType: \"lighting.integration\",\n priority: 920,\n unlockCount: 2 + Math.round(Math.max(0, Math.sin(state.time * 1.1)) * 4),\n frameId,\n });\n state.debugSession.recordPipelinePhase({\n owner: \"scene\",\n pipeline: \"scene-preparation\",\n stage: \"stable-visual-snapshot\",\n frameId,\n durationMs: synthetic * 0.38,\n snapshotAgeMs: Math.max(0, synthetic - 8),\n });\n state.debugSession.recordFrame({\n frameId,\n frameTimeMs: synthetic,\n targetFrameTimeMs: 16.67,\n gpuBusyMs: synthetic * 0.56,\n dropped: synthetic > 18,\n });\n return decision;\n}\n\nfunction renderSprays(ctx, sprays, camera, viewport) {\n for (const spray of sprays) {\n const projected = projectPoint(spray.position, camera, viewport);\n if (!projected) {\n continue;\n }\n const radius = clamp((1 / projected.depth) * 260, 1.5, 7.5);\n ctx.fillStyle = `rgba(225, 243, 250, ${clamp(spray.life / 1.6, 0, 0.9)})`;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderFlagPole(ctx, camera, viewport) {\n const base = projectPoint(vec3(-3.5, 0.7, 2.4), camera, viewport);\n const top = projectPoint(vec3(-3.5, 6.3, 2.4), camera, viewport);\n if (!base || !top) {\n return;\n }\n ctx.strokeStyle = \"rgba(77, 52, 41, 0.95)\";\n ctx.lineWidth = 6;\n ctx.beginPath();\n ctx.moveTo(base.x, base.y);\n ctx.lineTo(top.x, top.y);\n ctx.stroke();\n}\n\nfunction renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength) {\n const bounds = shipModel.bounds;\n const keelY = (shipModel.physics.waterline ?? 0.42) - 0.28;\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: 1.1 };\n const hullCorners = [\n vec3(bounds.min[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.max[2]),\n vec3(bounds.min[0], keelY, bounds.max[2]),\n ].map((point) => transformPoint(point, transform));\n\n renderProjectedShadow(ctx, hullCorners, camera, viewport, lightDir, {\n planeY: sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 - 0.03,\n alpha: 0.08 + shadowStrength * 0.2,\n blur: 14 + shadowStrength * 24,\n });\n}\n\nfunction renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength) {\n const clothPoints = [\n cloth.positions[0],\n cloth.positions[cloth.grid.cols - 1],\n cloth.positions[cloth.positions.length - 1],\n cloth.positions[cloth.positions.length - cloth.grid.cols],\n ];\n\n renderProjectedShadow(ctx, clothPoints, camera, viewport, lightDir, {\n planeY: 0.56,\n alpha: 0.05 + shadowStrength * 0.16,\n blur: 12 + shadowStrength * 20,\n });\n}\n\nfunction renderScene(ctx, canvas, state, shipModel, dom) {\n const viewport = { width: canvas.width, height: canvas.height };\n const camera = buildCamera(state, canvas);\n state.camera.eye = camera.eye;\n const lightingPlan = createLightingBandPlan({\n profile: state.focus === \"lighting\" ? defaultLightingProfile : getLightingProfile(defaultLightingProfile).name,\n importance: state.focus === \"lighting\" ? \"critical\" : \"high\",\n });\n const nearLighting = lightingPlan.bands.find((entry) => entry.band === \"near\") ?? lightingPlan.bands[0];\n const lightDir = normalizeVec3(vec3(-0.45, 0.85, -0.24));\n const lightingSnapshot = state.lightingDetail.getSnapshot();\n const visuals = resolveVisualConfig(\n nearLighting,\n lightingSnapshot,\n state.demoDescription?.visuals\n );\n state.demoVisuals = visuals;\n const reflectionStrength = visuals.reflectionStrength;\n const shadowStrength = visuals.shadowAccent;\n drawSkyAndShore(\n ctx,\n canvas,\n state,\n nearLighting,\n reflectionStrength,\n shadowStrength,\n visuals\n );\n\n const triangles = [];\n pushHarborGeometry(camera, viewport, triangles, visuals);\n const water = buildWaterBands(\n state,\n state.fluidDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (const bandMesh of water.bandMeshes) {\n const bandAccent = bandMesh.band === \"near\" ? 0.06 : bandMesh.band === \"mid\" ? 0.04 : 0;\n for (let index = 0; index < bandMesh.indices.length; index += 3) {\n const a = bandMesh.positions[bandMesh.indices[index]];\n const b = bandMesh.positions[bandMesh.indices[index + 1]];\n const c = bandMesh.positions[bandMesh.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: bandMesh.color,\n accent: bandAccent,\n });\n }\n }\n\n const cloth = buildClothSurface(\n state,\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (let index = 0; index < cloth.indices.length; index += 3) {\n const a = cloth.positions[cloth.indices[index]];\n const b = cloth.positions[cloth.indices[index + 1]];\n const c = cloth.positions[cloth.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: cloth.color,\n accent: cloth.band === \"near\" ? 0.1 : 0.04,\n });\n }\n\n for (const ship of state.ships) {\n buildTrianglesFromMesh(\n shipModel,\n { position: ship.position, rotationY: ship.rotationY, scale: 1.1 },\n ship.tint,\n camera,\n viewport,\n triangles,\n nearLighting.rtParticipation.directShadows === \"premium\" ? 0.08 : 0.02\n );\n }\n\n for (const ship of state.ships) {\n renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength);\n }\n renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength);\n\n drawTriangles(ctx, triangles, lightDir, reflectionStrength, camera, shadowStrength);\n renderWaterHighlights(ctx, water.bandMeshes, camera, viewport);\n renderFlagPole(ctx, camera, viewport);\n renderClothAccent(ctx, cloth, camera, viewport);\n for (const ship of state.ships) {\n renderShipRigging(ctx, ship, camera, viewport);\n }\n renderSprays(ctx, state.sprays, camera, viewport);\n\n const debugSnapshot = state.debugSession.getSnapshot();\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: lightingSnapshot,\n };\n\n const sceneMetrics = [\n `focus: ${state.focus}`,\n `ships: ${state.ships.length} active GLTF hulls`,\n `physics snapshot: ${state.physics.snapshot.stage} (${state.physics.snapshot.stability})`,\n `physics contacts: ${state.physics.snapshot.contactCount ?? 0}`,\n `cloth band: ${cloth.band} -> ${cloth.representation.output}`,\n `fluid near band: ${water.bandMeshes[0].representation.output}`,\n `lighting profile: ${lightingPlan.profile} (${lightingDistanceBands.length} bands)`,\n ];\n const qualityMetrics = [\n `fluid detail: ${quality.fluid.currentLevel.id} (${quality.fluid.currentLevel.config.nearResolution} near cells)`,\n `cloth detail: ${quality.cloth.currentLevel.id} (${quality.cloth.currentLevel.config.cols}x${quality.cloth.currentLevel.config.rows})`,\n `lighting detail: ${quality.lighting.currentLevel.id}`,\n `near shadows: ${nearLighting.primaryShadowSource}`,\n `near reflections: ${nearLighting.rtParticipation.reflections}`,\n `governor pressure: ${state.lastDecision.pressureLevel}`,\n `frame avg: ${state.lastDecision.metrics.averageFrameTimeMs.toFixed(2)} ms`,\n ];\n const debugMetrics = [\n `queue samples: ${debugSnapshot.queues.sampleCount}`,\n `dispatch avg: ${(debugSnapshot.dispatch.averageDurationMs ?? 0).toFixed(2)} ms`,\n `ready lane peak: ${debugSnapshot.dag.peakReadyLaneDepth.toFixed(1)}`,\n `pipeline samples: ${debugSnapshot.pipeline.sampleCount}`,\n `tracked memory: ${(debugSnapshot.memory.totalTrackedBytes / (1024 * 1024)).toFixed(1)} MB`,\n ];\n const sceneNotes =\n state.focus === \"physics\"\n ? [\n \"Stable world snapshots are taken after the authoritative rigid-body commit and before visual follow-up work.\",\n \"The ships collide on GLTF-derived hull volumes while cloth and fluid remain downstream visual consumers.\",\n \"Near-field lighting keeps the ray-traced-primary shadow impression so the collision read stays crisp.\",\n ]\n : SCENE_NOTES;\n const custom = state.demoDescription ?? null;\n\n setListContent(\n dom.sceneMetrics,\n Array.isArray(custom?.sceneMetrics) ? custom.sceneMetrics : sceneMetrics\n );\n setListContent(\n dom.qualityMetrics,\n Array.isArray(custom?.qualityMetrics) ? custom.qualityMetrics : qualityMetrics\n );\n setListContent(\n dom.debugMetrics,\n Array.isArray(custom?.debugMetrics) ? custom.debugMetrics : debugMetrics\n );\n setListContent(dom.sceneNotes, Array.isArray(custom?.notes) ? custom.notes : sceneNotes);\n\n dom.status.textContent =\n typeof custom?.status === \"string\"\n ? custom.status\n : `3D scene live · ${state.lastDecision.metrics.fps.toFixed(1)} FPS`;\n dom.details.textContent =\n typeof custom?.details === \"string\"\n ? custom.details\n : state.focus === \"physics\"\n ? `Stable world snapshots are emitted from ${state.physics.plan.snapshotStageId} after the authoritative solver; GLTF ships collide on ${shipModel.physics.shape ?? \"box\"} volumes while visual follow-up remains downstream.`\n : `GLTF ships are colliding with ${shipModel.physics.shape ?? \"box\"} physics volumes; cloth and fluid remain continuous while the governor pressure is ${state.lastDecision.pressureLevel}.`;\n}\n\nfunction updateSceneState(state, dt, shipModel) {\n updateShips(state, dt, shipModel);\n updateWaveImpulses(state, dt);\n updateSpray(state, dt);\n updatePhysicsSnapshot(state, shipModel);\n}\n\nfunction syncTextState(state, shipModel) {\n const snapshot = {\n coordinateSystem: \"right-handed world; +x right, +y up, +z forward from the shore\",\n focus: state.focus,\n stress: state.stress,\n ships: state.ships.map((ship) => ({\n id: ship.id,\n x: Number(ship.position.x.toFixed(2)),\n y: Number(ship.position.y.toFixed(2)),\n z: Number(ship.position.z.toFixed(2)),\n vx: Number(ship.velocity.x.toFixed(2)),\n vz: Number(ship.velocity.z.toFixed(2)),\n })),\n shipPhysics: shipModel.physics,\n sprays: state.sprays.length,\n waveImpulses: state.waveImpulses.length,\n pressure: state.lastDecision?.pressureLevel ?? \"stable\",\n physics: {\n profile: state.physics.profile,\n snapshotStageId: state.physics.plan.snapshotStageId,\n workerJobCount: state.physics.manifest.jobs.length,\n snapshot: state.physics.snapshot,\n },\n package: state.demoDescription?.textState ?? null,\n };\n window.render_game_to_text = () => JSON.stringify(snapshot);\n window.advanceTime = (ms) => {\n const step = Math.max(1, Math.round(ms / (1000 / 60)));\n for (let index = 0; index < step; index += 1) {\n state.frame += 1;\n state.time += 1 / 60;\n updateSceneState(state, 1 / 60, shipModel);\n state.lastDecision = recordTelemetry(state, 16.67 + (state.stress ? 6.5 : 0));\n }\n };\n}\n\nexport async function mountGpuShowcase(options = {}) {\n injectStyles();\n const root = options.root ?? document.body;\n const focus = options.focus ?? new URLSearchParams(window.location.search).get(\"focus\") ?? \"integrated\";\n const dom = buildDemoDom(root, {\n packageName: options.packageName ?? \"@plasius/gpu-demo-viewer\",\n title: options.title ?? DEFAULT_TITLE,\n subtitle: options.subtitle ?? DEFAULT_SUBTITLE,\n });\n dom.focusMode.value = focus;\n\n const state = createSceneState({ focus });\n const shipModel = await loadGltfModel(resolveShowcaseAssetUrl());\n state.shipModel = shipModel;\n state.packageState =\n typeof options.createState === \"function\" ? options.createState() : undefined;\n updatePhysicsSnapshot(state, shipModel);\n state.lastDecision = recordTelemetry(state, 16.4);\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n syncTextState(state, shipModel);\n\n const ctx = dom.canvas.getContext(\"2d\");\n const renderFrame = (nowMs) => {\n if (!state.paused) {\n if (state.lastTimeMs == null) {\n state.lastTimeMs = nowMs;\n }\n const dt = Math.min(0.033, (nowMs - state.lastTimeMs) / 1000);\n state.lastTimeMs = nowMs;\n state.time += dt;\n state.frame += 1;\n updateSceneState(state, dt, shipModel);\n updatePackageState(state, options, shipModel, dt);\n const syntheticFrame = 14.2 + state.sprays.length * 0.1 + (state.stress ? 6.4 : 0);\n state.lastDecision = recordTelemetry(state, syntheticFrame);\n }\n\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n renderScene(ctx, dom.canvas, state, shipModel, dom);\n syncTextState(state, shipModel);\n requestAnimationFrame(renderFrame);\n };\n\n dom.pauseButton.addEventListener(\"click\", () => {\n state.paused = !state.paused;\n dom.pauseButton.textContent = state.paused ? \"Resume\" : \"Pause\";\n });\n dom.stressToggle.addEventListener(\"change\", () => {\n state.stress = dom.stressToggle.checked;\n });\n dom.focusMode.addEventListener(\"change\", () => {\n state.focus = dom.focusMode.value;\n Object.assign(state.camera, {\n ...CAMERA_PRESETS[state.focus],\n target: vec3(...CAMERA_PRESETS[state.focus].target),\n });\n });\n\n requestAnimationFrame(renderFrame);\n return {\n state,\n shipModel,\n canvas: dom.canvas,\n };\n}\n\nfunction updatePhysicsSnapshot(state, shipModel) {\n state.physics.snapshot = createPhysicsWorldSnapshot({\n frameId: `showcase-${state.frame}`,\n tick: state.frame,\n simulationTimeMs: Number((state.time * 1000).toFixed(2)),\n profile: state.physics.profile,\n authoritativeTransformRevision: state.frame,\n secondarySimulationRevision: state.frame,\n animationInputRevision: state.frame,\n bodyCount: state.ships.length + 2,\n dynamicBodyCount: state.ships.length,\n contactCount: state.collisionFlash > 0.02 ? 1 : 0,\n metadata: {\n collisionCount: state.collisionCount,\n contactCount: state.contactCount,\n snapshotStageId: state.physics.plan.snapshotStageId,\n rigidBodyShape: shipModel.physics.shape ?? \"box\",\n },\n });\n}\n","export const showcaseFocusModes = Object.freeze([\n \"integrated\",\n \"lighting\",\n \"cloth\",\n \"fluid\",\n \"physics\",\n \"performance\",\n \"debug\",\n]);\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n}\n\nexport async function loadGltfModel(url) {\n const module = await import(\"./gltf-loader.js\");\n return module.loadGltfModel(url);\n}\n\nexport async function mountGpuShowcase(options = {}) {\n const runtimeLoader =\n typeof options.__runtimeLoader === \"function\"\n ? options.__runtimeLoader\n : () => import(\"./showcase-runtime.js\");\n const module = await runtimeLoader();\n if (typeof module.mountGpuShowcase !== \"function\") {\n throw new Error(\"showcase runtime loader must provide mountGpuShowcase.\");\n }\n\n const publicOptions = { ...options };\n delete publicOptions.__runtimeLoader;\n return module.mountGpuShowcase(publicOptions);\n}\n"],"mappings":"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","names":["document","assertIdentifier","assertFinitePositiveNumber","assertFiniteNonNegativeNumber","assertRatio","assertEnumValue","buildBandSettings","defaultBandInputs","normalizeThresholds","buildRepresentationDescriptor","profileRepresentationSpecs","createSimulationStage","simulationStageLabels","interactiveWorkerProfileSpec","cinematicWorkerProfileSpec","interactiveSimulationStages","cinematicSimulationStages","assertEnumValue","assertIdentifier","average","module","isRecord","assertIdentifier","IDENTIFIER_PATTERN","assertEnumValue","readPositiveNumber","readNonNegativeNumber","normalizePlainObject","isAbortSignalLike","assertIdentifier","buildWorkerBudgetLevels","baseUrl","import_meta","init_dist","loadGltfModel","mountGpuShowcase","resolveShowcaseAssetUrl","showcaseFocusModes","import_meta","baseUrl","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/gltf-loader.js","../node_modules/@plasius/gpu-cloth/src/types.ts","../node_modules/@plasius/gpu-cloth/src/validation.ts","../node_modules/@plasius/gpu-cloth/src/continuity.ts","../node_modules/@plasius/gpu-cloth/src/representation.ts","../node_modules/@plasius/gpu-cloth/src/worker.ts","../node_modules/@plasius/gpu-fluid/src/types.ts","../node_modules/@plasius/gpu-fluid/src/validation.ts","../node_modules/@plasius/gpu-fluid/src/continuity.ts","../node_modules/@plasius/gpu-fluid/src/representation.ts","../node_modules/@plasius/gpu-fluid/src/worker.ts","../node_modules/@plasius/gpu-lighting/src/index.js","../node_modules/@plasius/gpu-performance/src/validation.ts","../node_modules/@plasius/gpu-performance/src/device.ts","../node_modules/@plasius/gpu-performance/src/budget.ts","../node_modules/@plasius/gpu-performance/src/governor.ts","../node_modules/@plasius/gpu-performance/src/ladder.ts","../node_modules/@plasius/gpu-performance/src/worker.ts","../node_modules/@plasius/gpu-debug/src/validation.ts","../node_modules/@plasius/gpu-debug/src/session.ts","../node_modules/@plasius/gpu-physics/src/browser.js","../node_modules/@plasius/gpu-physics/dist/browser.js","../src/showcase-runtime.js","../src/index.js"],"sourcesContent":["function decodeDataUri(uri) {\n const match = /^data:.*?;base64,(.+)$/i.exec(uri);\n if (!match) {\n throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);\n }\n\n const binary = atob(match[1]);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes.buffer;\n}\n\nfunction getComponentArray(componentType, buffer, byteOffset, count) {\n switch (componentType) {\n case 5123:\n return new Uint16Array(buffer, byteOffset, count);\n case 5125:\n return new Uint32Array(buffer, byteOffset, count);\n case 5126:\n return new Float32Array(buffer, byteOffset, count);\n default:\n throw new Error(`Unsupported glTF componentType: ${componentType}`);\n }\n}\n\nfunction getTypeSize(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n default:\n throw new Error(`Unsupported glTF accessor type: ${type}`);\n }\n}\n\nfunction readAccessor(document, accessorIndex, buffers) {\n const accessor = document.accessors[accessorIndex];\n const bufferView = document.bufferViews[accessor.bufferView];\n const buffer = buffers[bufferView.buffer];\n const componentCount = getTypeSize(accessor.type);\n const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);\n const valueCount = accessor.count * componentCount;\n return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);\n}\n\nfunction getMaterialColor(document, primitive) {\n const material = document.materials?.[primitive.material] ?? null;\n const factor =\n material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];\n return {\n r: factor[0],\n g: factor[1],\n b: factor[2],\n a: factor[3] ?? 1,\n };\n}\n\nfunction computeBounds(positions) {\n const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];\n const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];\n for (let index = 0; index < positions.length; index += 3) {\n min[0] = Math.min(min[0], positions[index]);\n min[1] = Math.min(min[1], positions[index + 1]);\n min[2] = Math.min(min[2], positions[index + 2]);\n max[0] = Math.max(max[0], positions[index]);\n max[1] = Math.max(max[1], positions[index + 1]);\n max[2] = Math.max(max[2], positions[index + 2]);\n }\n return { min, max };\n}\n\nexport async function loadGltfModel(url) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);\n }\n\n const document = await response.json();\n const buffers = await Promise.all(\n (document.buffers ?? []).map(async (buffer) => {\n if (typeof buffer.uri !== \"string\") {\n throw new Error(\"glTF buffer URI is required for demo asset loading.\");\n }\n if (buffer.uri.startsWith(\"data:\")) {\n return decodeDataUri(buffer.uri);\n }\n const nested = await fetch(new URL(buffer.uri, url));\n if (!nested.ok) {\n throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);\n }\n return nested.arrayBuffer();\n })\n );\n\n const scene = document.scenes?.[document.scene ?? 0];\n if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {\n throw new Error(\"glTF demo asset must expose a default scene with at least one node.\");\n }\n\n const node = document.nodes[scene.nodes[0]];\n const mesh = document.meshes[node.mesh];\n const primitive = mesh.primitives[0];\n const positions = Array.from(readAccessor(document, primitive.attributes.POSITION, buffers));\n const indices = Array.from(readAccessor(document, primitive.indices, buffers));\n\n return Object.freeze({\n name: node.name ?? mesh.name ?? \"gltf-model\",\n positions,\n indices,\n bounds: computeBounds(positions),\n color: getMaterialColor(document, primitive),\n physics: Object.freeze({ ...(node.extras?.physics ?? {}) }),\n });\n}\n","/**\n * Supported cloth planning profiles.\n */\nexport const clothProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Cloth planning profile identifier.\n */\nexport type ClothProfileName = (typeof clothProfileNames)[number];\n\n/**\n * Cloth asset categories currently modeled by the package.\n */\nexport const clothGarmentKinds = [\n \"cape\",\n \"skirt\",\n \"flag\",\n \"curtain\",\n \"custom\",\n] as const;\n\n/**\n * Cloth garment kind.\n */\nexport type ClothGarmentKind = (typeof clothGarmentKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const clothRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type ClothRepresentationBand = (typeof clothRepresentationBands)[number];\n\n/**\n * Supported render outputs for each cloth band.\n */\nexport const clothRepresentationOutputs = [\n \"fullSimulation\",\n \"reducedSimulation\",\n \"poseProxy\",\n \"silhouetteImpression\",\n] as const;\n\n/**\n * Render output type for a banded cloth representation.\n */\nexport type ClothRepresentationOutput =\n (typeof clothRepresentationOutputs)[number];\n\n/**\n * Cloth continuity strategies across range transitions.\n */\nexport const clothContinuityStrategies = [\n \"shared-solver-state\",\n \"shared-motion-field\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type ClothContinuityStrategy =\n (typeof clothContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const clothRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type ClothRtParticipation = (typeof clothRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a cloth representation.\n */\nexport const clothShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type ClothShadowMode = (typeof clothShadowModes)[number];\n\n/**\n * Worker queues used by cloth preparation.\n */\nexport const clothWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type ClothWorkerQueueClass =\n (typeof clothWorkerQueueClasses)[number];\n\n/**\n * Safety classification for cloth jobs.\n */\nexport const clothWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type ClothWorkerAuthority =\n (typeof clothWorkerAuthorities)[number];\n\n/**\n * Importance ranking for cloth jobs.\n */\nexport const clothWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type ClothWorkerImportance =\n (typeof clothWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const clothPerformanceDomains = [\n \"cloth\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by cloth jobs.\n */\nexport type ClothPerformanceDomain =\n (typeof clothPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const clothMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type ClothMotionClass = (typeof clothMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceQualityDimensions {\n geometry?: number;\n deformation?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: ClothMotionClass;\n shadowSignificance?: ClothWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface ClothContinuityBandInput {\n blendWindowMeters?: number;\n silhouetteFloor?: number;\n broadMotionFloor?: number;\n wrinkleFloor?: number;\n retainPinnedAnchors?: boolean;\n retainWindPhase?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface ClothContinuityEnvelopeInput {\n garmentId: string;\n continuityGroupId?: string;\n motionFieldId?: string;\n strategy?: ClothContinuityStrategy;\n bands?: Partial<Record<ClothRepresentationBand, ClothContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface ClothContinuityBandSettings {\n inheritsFromBand?: ClothRepresentationBand;\n blendWindowMeters: number;\n silhouetteFloor: number;\n broadMotionFloor: number;\n wrinkleFloor: number;\n retainPinnedAnchors: boolean;\n retainWindPhase: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface ClothContinuityEnvelope {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n bands: Readonly<Record<ClothRepresentationBand, ClothContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a cloth band.\n */\nexport interface ClothRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Mesh and solver hints for a representation band.\n */\nexport interface ClothMeshResolution {\n simulationVertices: number;\n collisionSamples: number;\n solverIterations: number;\n wrinkleLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface ClothShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n selfShadowing: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface ClothRepresentationPerformanceHints {\n owner: \"cloth\";\n queueClass: \"render\";\n priorityHint: number;\n importance: ClothWorkerImportance;\n representationBand: ClothRepresentationBand;\n qualityDimensions: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals: Readonly<ClothPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface ClothRepresentationDescriptor {\n id: string;\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n band: ClothRepresentationBand;\n output: ClothRepresentationOutput;\n mesh: Readonly<ClothMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: ClothRtParticipation;\n shadowMode: ClothShadowMode;\n shading: Readonly<ClothShadingPlan>;\n continuity: Readonly<ClothContinuityBandSettings> & {\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n };\n performance: Readonly<ClothRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface ClothRepresentationPlanOptions {\n garmentId: string;\n kind?: ClothGarmentKind;\n profile?: ClothProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<ClothContinuityEnvelopeInput, \"garmentId\">>;\n}\n\n/**\n * Full cloth representation plan.\n */\nexport interface ClothRepresentationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<ClothRangeThresholds>;\n continuity: Readonly<ClothContinuityEnvelope>;\n bands: readonly ClothRepresentationBand[];\n representations: readonly ClothRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface ClothWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the cloth package.\n */\nexport interface ClothWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n levels: readonly ClothWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface ClothWorkerManifest {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly ClothWorkerManifestJob[];\n}\n\n/**\n * Ordered cloth simulation stages.\n */\nexport const clothSimulationStageOrder = [\n \"snapshot-ingest\",\n \"wind-field-advance\",\n \"pin-constraint-update\",\n \"cloth-solve\",\n \"near-cloth\",\n \"mid-cloth\",\n \"far-proxy\",\n \"horizon-impression\",\n \"wrinkle-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Cloth simulation stage identifier.\n */\nexport type ClothSimulationStageId =\n (typeof clothSimulationStageOrder)[number];\n\n/**\n * One stage in the cloth simulation/scene-prep plan.\n */\nexport interface ClothSimulationPlanStage {\n id: ClothSimulationStageId;\n label: string;\n queueClass: ClothWorkerQueueClass;\n root: boolean;\n dependencies: readonly ClothSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the cloth package.\n */\nexport interface ClothSimulationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: ClothContinuityStrategy;\n requiresSharedMotionField: true;\n bands: readonly ClothRepresentationBand[];\n }>;\n stages: readonly ClothSimulationPlanStage[];\n}\n","import {\n clothContinuityStrategies,\n clothGarmentKinds,\n clothProfileNames,\n clothRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\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\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeClothProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, clothProfileNames);\n}\n\nexport function normalizeClothGarmentKind(value: unknown) {\n return assertEnumValue(\"kind\", value, clothGarmentKinds);\n}\n\nexport function normalizeClothContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, clothContinuityStrategies);\n}\n\nexport function normalizeClothRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, clothRepresentationBands);\n}\n","import type {\n ClothContinuityBandInput,\n ClothContinuityBandSettings,\n ClothContinuityEnvelope,\n ClothContinuityEnvelopeInput,\n ClothRepresentationBand,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFinitePositiveNumber,\n assertIdentifier,\n assertRatio,\n normalizeClothContinuityStrategy,\n} from \"./validation.js\";\n\nconst clothBandInheritance: Readonly<\n Record<ClothRepresentationBand, ClothRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<ClothRepresentationBand, Required<ClothContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 3,\n silhouetteFloor: 1,\n broadMotionFloor: 1,\n wrinkleFloor: 1,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 8,\n silhouetteFloor: 0.82,\n broadMotionFloor: 0.78,\n wrinkleFloor: 0.5,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 20,\n silhouetteFloor: 0.58,\n broadMotionFloor: 0.48,\n wrinkleFloor: 0.2,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 40,\n silhouetteFloor: 0.28,\n broadMotionFloor: 0.24,\n wrinkleFloor: 0.05,\n retainPinnedAnchors: true,\n retainWindPhase: false,\n }),\n});\n\nfunction buildBandSettings(\n band: ClothRepresentationBand,\n input: ClothContinuityBandInput | undefined\n): ClothContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: clothBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n silhouetteFloor:\n input?.silhouetteFloor === undefined\n ? defaults.silhouetteFloor\n : assertRatio(\n `continuity.bands.${band}.silhouetteFloor`,\n input.silhouetteFloor\n ),\n broadMotionFloor:\n input?.broadMotionFloor === undefined\n ? defaults.broadMotionFloor\n : assertRatio(\n `continuity.bands.${band}.broadMotionFloor`,\n input.broadMotionFloor\n ),\n wrinkleFloor:\n input?.wrinkleFloor === undefined\n ? defaults.wrinkleFloor\n : assertRatio(\n `continuity.bands.${band}.wrinkleFloor`,\n input.wrinkleFloor\n ),\n retainPinnedAnchors:\n input?.retainPinnedAnchors ?? defaults.retainPinnedAnchors,\n retainWindPhase: input?.retainWindPhase ?? defaults.retainWindPhase,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all cloth\n * representation bands.\n */\nexport function createClothContinuityEnvelope(\n input: ClothContinuityEnvelopeInput\n): ClothContinuityEnvelope {\n const garmentId = assertIdentifier(\"garmentId\", input.garmentId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${garmentId}.continuity`;\n const motionFieldId = input.motionFieldId\n ? assertIdentifier(\"motionFieldId\", input.motionFieldId)\n : `${garmentId}.motion-field`;\n const strategy = input.strategy\n ? normalizeClothContinuityStrategy(input.strategy)\n : \"shared-motion-field\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n clothRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<ClothRepresentationBand, ClothContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n continuityGroupId,\n motionFieldId,\n strategy,\n bands,\n });\n}\n","import { createClothContinuityEnvelope } from \"./continuity.js\";\nimport type {\n ClothGarmentKind,\n ClothProfileName,\n ClothRangeThresholds,\n ClothRepresentationBand,\n ClothRepresentationDescriptor,\n ClothRepresentationPlan,\n ClothRepresentationPlanOptions,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeClothGarmentKind,\n normalizeClothProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n ClothRepresentationDescriptor,\n | \"id\"\n | \"garmentId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<ClothRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<ClothProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 12000,\n collisionSamples: 96,\n solverIterations: 10,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 450,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 4200,\n collisionSamples: 40,\n solverIterations: 6,\n wrinkleLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 320,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 700,\n collisionSamples: 8,\n solverIterations: 2,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 200,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 80,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 100,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 18000,\n collisionSamples: 128,\n solverIterations: 14,\n wrinkleLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 490,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.9,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 6800,\n collisionSamples: 56,\n solverIterations: 8,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 350,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.76,\n deformation: 0.8,\n shading: 0.7,\n rayTracing: 0.5,\n updateCadence: 0.82,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 1200,\n collisionSamples: 12,\n solverIterations: 3,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.35,\n deformation: 0.38,\n shading: 0.3,\n rayTracing: 0.12,\n updateCadence: 0.35,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 120,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): ClothRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Cloth range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n garmentId: string,\n kind: ClothGarmentKind,\n profile: ClothProfileName,\n band: ClothRepresentationBand,\n supportsRayTracing: boolean,\n options: ClothRepresentationPlanOptions\n): ClothRepresentationDescriptor {\n const continuityEnvelope = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${garmentId}.${band}.${profileSpec.output}`,\n garmentId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n motionFieldId: continuityEnvelope.motionFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n silhouetteFloor: continuity.silhouetteFloor,\n broadMotionFloor: continuity.broadMotionFloor,\n wrinkleFloor: continuity.wrinkleFloor,\n retainPinnedAnchors: continuity.retainPinnedAnchors,\n retainWindPhase: continuity.retainWindPhase,\n }),\n performance: profileSpec.performance,\n });\n}\n\n/**\n * Selects the active cloth representation band for a given distance.\n */\nexport function selectClothRepresentationBand(\n distanceMeters: number,\n thresholds: ClothRangeThresholds\n): ClothRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware cloth representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createClothRepresentationPlan(\n options: ClothRepresentationPlanOptions\n): ClothRepresentationPlan {\n const garmentId = assertIdentifier(\"garmentId\", options.garmentId);\n const kind = options.kind\n ? normalizeClothGarmentKind(options.kind)\n : \"cape\";\n const profile = options.profile\n ? normalizeClothProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 18,\n options.midFieldMaxMeters ?? 55,\n options.farFieldMaxMeters ?? 180\n );\n const continuity = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: clothRepresentationBands,\n representations: Object.freeze(\n clothRepresentationBands.map((band) =>\n buildRepresentationDescriptor(garmentId, kind, profile, band, supportsRayTracing, options)\n )\n ),\n });\n}\n","import type {\n ClothPerformanceDomain,\n ClothPerformanceImportanceSignals,\n ClothPerformanceQualityDimensions,\n ClothProfileName,\n ClothRepresentationBand,\n ClothSimulationPlan,\n ClothSimulationPlanStage,\n ClothSimulationStageId,\n ClothWorkerAuthority,\n ClothWorkerBudgetLevel,\n ClothWorkerImportance,\n ClothWorkerManifest,\n ClothWorkerManifestJob,\n ClothWorkerQueueClass,\n} from \"./types.js\";\nimport { clothProfileNames, clothRepresentationBands } from \"./types.js\";\nimport { normalizeClothProfile } from \"./validation.js\";\n\nexport const clothDebugOwner = \"cloth\";\nexport const defaultClothProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<ClothSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"wind-field-advance\": \"Advance wind and external force field\",\n \"pin-constraint-update\": \"Resolve pin and attachment constraints\",\n \"cloth-solve\": \"Solve cloth state\",\n \"near-cloth\": \"Prepare near-field cloth simulation output\",\n \"mid-cloth\": \"Prepare mid-field cloth simulation output\",\n \"far-proxy\": \"Prepare far-field garment proxy\",\n \"horizon-impression\": \"Prepare horizon silhouette impression\",\n \"wrinkle-history\": \"Propagate wrinkle and crease history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: ClothSimulationPlanStage\n): ClothSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: ClothWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly ClothWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"cloth\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: ClothProfileName,\n key: string,\n spec: WorkerJobSpec\n): ClothWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"cloth\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"cloth\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive cloth profile that preserves stable attachment and silhouette continuity while scaling distant garment cost before near-field fidelity.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"cloth.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.snapshot\"]),\n levels: {\n low: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 64, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"wind-field-advance\": Object.freeze({\n label: \"cloth.wind-field-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.wind\"]),\n levels: {\n low: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.7, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"pin-constraint-update\": Object.freeze({\n label: \"cloth.pin-constraint-update\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.pins\"]),\n levels: {\n low: { estimatedCostMs: 0.35, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.55, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"cloth-solve\": Object.freeze({\n label: \"cloth.solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"pin-constraint-update\", \"wind-field-advance\"]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.solve\"]),\n levels: {\n low: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 1.9, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"near-cloth\": Object.freeze({\n label: \"cloth.near-cloth\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.near\"]),\n levels: {\n low: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 1.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n high: { estimatedCostMs: 2.2, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n },\n }),\n \"mid-cloth\": Object.freeze({\n label: \"cloth.mid-cloth\",\n queueClass: \"render\",\n priority: 320,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.mid\"]),\n levels: {\n low: { estimatedCostMs: 0.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.55, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.72, maxQueueDepth: 64 },\n high: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 20, cadenceDivisor: 1, workgroupScale: 0.9, maxQueueDepth: 96 },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"cloth.far-proxy\",\n queueClass: \"render\",\n priority: 200,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.far\"]),\n levels: {\n low: { estimatedCostMs: 0.15, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.4, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 4, workgroupScale: 0.55, maxQueueDepth: 32 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 3, workgroupScale: 0.7, maxQueueDepth: 48 },\n },\n }),\n \"horizon-impression\": Object.freeze({\n label: \"cloth.horizon-impression\",\n queueClass: \"render\",\n priority: 100,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.horizon\"]),\n levels: {\n low: { estimatedCostMs: 0.08, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 4, cadenceDivisor: 10, workgroupScale: 0.25, maxQueueDepth: 16 },\n medium: { estimatedCostMs: 0.12, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 6, cadenceDivisor: 8, workgroupScale: 0.35, maxQueueDepth: 24 },\n high: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.45, maxQueueDepth: 32 },\n },\n }),\n \"wrinkle-history\": Object.freeze({\n label: \"cloth.wrinkle-history\",\n queueClass: \"render\",\n priority: 300,\n dependencies: Object.freeze([\"near-cloth\", \"mid-cloth\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n deformation: 0.5,\n shading: 0.4,\n updateCadence: 0.5,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.wrinkles\"]),\n levels: {\n low: { estimatedCostMs: 0.18, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 3, workgroupScale: 0.45, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.65, maxQueueDepth: 48 },\n high: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic cloth profile that spends more budget on near and mid-field garment deformation before degrading distant cloth work.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-cloth\" || key === \"mid-cloth\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: { ...spec.levels.low, estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)) },\n medium: { ...spec.levels.medium, estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)) },\n high: { ...spec.levels.high, estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)) },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst clothWorkerProfileSpecs: Readonly<Record<ClothProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze([\n createSimulationStage({ id: \"snapshot-ingest\", label: simulationStageLabels[\"snapshot-ingest\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"physics-snapshot\", snapshotStable: true }),\n createSimulationStage({ id: \"wind-field-advance\", label: simulationStageLabels[\"wind-field-advance\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"wind-field\", snapshotStable: false }),\n createSimulationStage({ id: \"pin-constraint-update\", label: simulationStageLabels[\"pin-constraint-update\"], queueClass: \"simulation\", root: false, dependencies: [\"snapshot-ingest\"], output: \"pin-constraints\", snapshotStable: true }),\n createSimulationStage({ id: \"cloth-solve\", label: simulationStageLabels[\"cloth-solve\"], queueClass: \"simulation\", root: false, dependencies: [\"pin-constraint-update\", \"wind-field-advance\"], output: \"cloth-state\", snapshotStable: true }),\n createSimulationStage({ id: \"near-cloth\", label: simulationStageLabels[\"near-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"near-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"mid-cloth\", label: simulationStageLabels[\"mid-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"mid-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"far-proxy\", label: simulationStageLabels[\"far-proxy\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"far-proxy-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"horizon-impression\", label: simulationStageLabels[\"horizon-impression\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"horizon-cloth-impression\", snapshotStable: true }),\n createSimulationStage({ id: \"wrinkle-history\", label: simulationStageLabels[\"wrinkle-history\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\"], output: \"wrinkle-history-state\", snapshotStable: true }),\n createSimulationStage({ id: \"render-snapshot\", label: simulationStageLabels[\"render-snapshot\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\", \"far-proxy\", \"horizon-impression\", \"wrinkle-history\"], output: \"cloth-render-snapshot\", snapshotStable: true }),\n]);\n\nconst cinematicSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-impression\"\n ? createSimulationStage({\n ...stage,\n output:\n stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-cloth-impression-cinematic\",\n })\n : stage\n )\n);\n\nconst clothSimulationPlanSpecs: Readonly<\n Record<ClothProfileName, readonly ClothSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected cloth profile.\n */\nexport function getClothWorkerManifest(\n profile: ClothProfileName = defaultClothProfile\n): ClothWorkerManifest {\n const profileName = normalizeClothProfile(profile);\n const spec = clothWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level cloth simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createClothSimulationPlan(\n profile: ClothProfileName = defaultClothProfile\n): ClothSimulationPlan {\n const profileName = normalizeClothProfile(profile);\n const stages = clothSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n description: clothWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-motion-field\",\n requiresSharedMotionField: true,\n bands: clothRepresentationBands,\n }),\n stages,\n });\n}\n","/**\n * Supported fluid planning profiles.\n */\nexport const fluidProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Fluid planning profile identifier.\n */\nexport type FluidProfileName = (typeof fluidProfileNames)[number];\n\n/**\n * Fluid body categories currently modeled by the package.\n */\nexport const fluidBodyKinds = [\n \"ocean\",\n \"lake\",\n \"river\",\n \"waterfall\",\n \"custom\",\n] as const;\n\n/**\n * Fluid body kind.\n */\nexport type FluidBodyKind = (typeof fluidBodyKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const fluidRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type FluidRepresentationBand = (typeof fluidRepresentationBands)[number];\n\n/**\n * Supported render outputs for each fluid band.\n */\nexport const fluidRepresentationOutputs = [\n \"liveSurface\",\n \"simplifiedSurface\",\n \"mergedProxy\",\n \"horizonShell\",\n] as const;\n\n/**\n * Render output type for a banded fluid representation.\n */\nexport type FluidRepresentationOutput =\n (typeof fluidRepresentationOutputs)[number];\n\n/**\n * Fluid continuity strategies across range transitions.\n */\nexport const fluidContinuityStrategies = [\n \"shared-spectrum\",\n \"shared-heightfield\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type FluidContinuityStrategy =\n (typeof fluidContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const fluidRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type FluidRtParticipation = (typeof fluidRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a fluid representation.\n */\nexport const fluidShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type FluidShadowMode = (typeof fluidShadowModes)[number];\n\n/**\n * Worker queues used by fluid preparation.\n */\nexport const fluidWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type FluidWorkerQueueClass =\n (typeof fluidWorkerQueueClasses)[number];\n\n/**\n * Safety classification for fluid jobs.\n */\nexport const fluidWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type FluidWorkerAuthority =\n (typeof fluidWorkerAuthorities)[number];\n\n/**\n * Importance ranking for fluid jobs.\n */\nexport const fluidWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type FluidWorkerImportance =\n (typeof fluidWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const fluidPerformanceDomains = [\n \"physics\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by fluid jobs.\n */\nexport type FluidPerformanceDomain =\n (typeof fluidPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const fluidMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type FluidMotionClass = (typeof fluidMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceQualityDimensions {\n geometry?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: FluidMotionClass;\n shadowSignificance?: FluidWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface FluidContinuityBandInput {\n blendWindowMeters?: number;\n amplitudeFloor?: number;\n frequencyFloor?: number;\n retainFoamHistory?: boolean;\n retainLowFrequencyWaves?: boolean;\n retainDirectionality?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface FluidContinuityEnvelopeInput {\n fluidBodyId: string;\n continuityGroupId?: string;\n waveFieldId?: string;\n strategy?: FluidContinuityStrategy;\n bands?: Partial<Record<FluidRepresentationBand, FluidContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface FluidContinuityBandSettings {\n inheritsFromBand?: FluidRepresentationBand;\n blendWindowMeters: number;\n amplitudeFloor: number;\n frequencyFloor: number;\n retainFoamHistory: boolean;\n retainLowFrequencyWaves: boolean;\n retainDirectionality: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface FluidContinuityEnvelope {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n bands: Readonly<Record<FluidRepresentationBand, FluidContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a fluid band.\n */\nexport interface FluidRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Resolution hints for a representation band.\n */\nexport interface FluidMeshResolution {\n patchSizeMeters: number;\n subdivisions: number;\n activeWaveOctaves: number;\n foamLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface FluidShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n caustics: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface FluidRepresentationPerformanceHints {\n owner: \"fluid\";\n queueClass: \"render\";\n priorityHint: number;\n importance: FluidWorkerImportance;\n representationBand: FluidRepresentationBand;\n qualityDimensions: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals: Readonly<FluidPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface FluidRepresentationDescriptor {\n id: string;\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n band: FluidRepresentationBand;\n output: FluidRepresentationOutput;\n mesh: Readonly<FluidMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: FluidRtParticipation;\n shadowMode: FluidShadowMode;\n shading: Readonly<FluidShadingPlan>;\n continuity: Readonly<FluidContinuityBandSettings> & {\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n };\n performance: Readonly<FluidRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface FluidRepresentationPlanOptions {\n fluidBodyId: string;\n kind?: FluidBodyKind;\n profile?: FluidProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<FluidContinuityEnvelopeInput, \"fluidBodyId\">>;\n}\n\n/**\n * Full fluid representation plan.\n */\nexport interface FluidRepresentationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<FluidRangeThresholds>;\n continuity: Readonly<FluidContinuityEnvelope>;\n bands: readonly FluidRepresentationBand[];\n representations: readonly FluidRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface FluidWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the fluid package.\n */\nexport interface FluidWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n levels: readonly FluidWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface FluidWorkerManifest {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly FluidWorkerManifestJob[];\n}\n\n/**\n * Ordered fluid simulation stages.\n */\nexport const fluidSimulationStageOrder = [\n \"snapshot-ingest\",\n \"spectrum-advance\",\n \"boundary-coupling\",\n \"surface-solve\",\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Fluid simulation stage identifier.\n */\nexport type FluidSimulationStageId =\n (typeof fluidSimulationStageOrder)[number];\n\n/**\n * One stage in the fluid simulation/scene-prep plan.\n */\nexport interface FluidSimulationPlanStage {\n id: FluidSimulationStageId;\n label: string;\n queueClass: FluidWorkerQueueClass;\n root: boolean;\n dependencies: readonly FluidSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the fluid package.\n */\nexport interface FluidSimulationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: FluidContinuityStrategy;\n requiresSharedWaveField: true;\n bands: readonly FluidRepresentationBand[];\n }>;\n stages: readonly FluidSimulationPlanStage[];\n}\n","import {\n fluidBodyKinds,\n fluidContinuityStrategies,\n fluidProfileNames,\n fluidRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\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\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeFluidProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, fluidProfileNames);\n}\n\nexport function normalizeFluidBodyKind(value: unknown) {\n return assertEnumValue(\"kind\", value, fluidBodyKinds);\n}\n\nexport function normalizeFluidContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, fluidContinuityStrategies);\n}\n\nexport function normalizeFluidRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, fluidRepresentationBands);\n}\n","import type {\n FluidContinuityBandInput,\n FluidContinuityBandSettings,\n FluidContinuityEnvelope,\n FluidContinuityEnvelopeInput,\n FluidRepresentationBand,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertIdentifier,\n assertFinitePositiveNumber,\n assertRatio,\n normalizeFluidContinuityStrategy,\n} from \"./validation.js\";\n\nconst fluidBandInheritance: Readonly<\n Record<FluidRepresentationBand, FluidRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<FluidRepresentationBand, Required<FluidContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 6,\n amplitudeFloor: 1,\n frequencyFloor: 1,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 14,\n amplitudeFloor: 0.72,\n frequencyFloor: 0.78,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 32,\n amplitudeFloor: 0.34,\n frequencyFloor: 0.42,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 72,\n amplitudeFloor: 0.16,\n frequencyFloor: 0.18,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n});\n\nfunction buildBandSettings(\n band: FluidRepresentationBand,\n input: FluidContinuityBandInput | undefined\n): FluidContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: fluidBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n amplitudeFloor:\n input?.amplitudeFloor === undefined\n ? defaults.amplitudeFloor\n : assertRatio(\n `continuity.bands.${band}.amplitudeFloor`,\n input.amplitudeFloor\n ),\n frequencyFloor:\n input?.frequencyFloor === undefined\n ? defaults.frequencyFloor\n : assertRatio(\n `continuity.bands.${band}.frequencyFloor`,\n input.frequencyFloor\n ),\n retainFoamHistory: input?.retainFoamHistory ?? defaults.retainFoamHistory,\n retainLowFrequencyWaves:\n input?.retainLowFrequencyWaves ?? defaults.retainLowFrequencyWaves,\n retainDirectionality:\n input?.retainDirectionality ?? defaults.retainDirectionality,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all fluid\n * representation bands.\n */\nexport function createFluidContinuityEnvelope(\n input: FluidContinuityEnvelopeInput\n): FluidContinuityEnvelope {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", input.fluidBodyId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${fluidBodyId}.continuity`;\n const waveFieldId = input.waveFieldId\n ? assertIdentifier(\"waveFieldId\", input.waveFieldId)\n : `${fluidBodyId}.wave-field`;\n const strategy = input.strategy\n ? normalizeFluidContinuityStrategy(input.strategy)\n : \"shared-spectrum\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n fluidRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<FluidRepresentationBand, FluidContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n continuityGroupId,\n waveFieldId,\n strategy,\n bands,\n });\n}\n","import { createFluidContinuityEnvelope } from \"./continuity.js\";\nimport type {\n FluidBodyKind,\n FluidProfileName,\n FluidRangeThresholds,\n FluidRepresentationBand,\n FluidRepresentationDescriptor,\n FluidRepresentationPlan,\n FluidRepresentationPlanOptions,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeFluidBodyKind,\n normalizeFluidProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n FluidRepresentationDescriptor,\n | \"id\"\n | \"fluidBodyId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<FluidRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<FluidProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.5,\n subdivisions: 256,\n activeWaveOctaves: 8,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 460,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1.5,\n subdivisions: 128,\n activeWaveOctaves: 6,\n foamLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 330,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 6,\n subdivisions: 48,\n activeWaveOctaves: 4,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 210,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 24,\n subdivisions: 12,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.35,\n subdivisions: 320,\n activeWaveOctaves: 9,\n foamLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 500,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1,\n subdivisions: 192,\n activeWaveOctaves: 7,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 360,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.8,\n shading: 0.78,\n rayTracing: 0.64,\n updateCadence: 0.74,\n temporalReuse: 0.45,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 4,\n subdivisions: 80,\n activeWaveOctaves: 5,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.4,\n shading: 0.42,\n rayTracing: 0.24,\n updateCadence: 0.34,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 18,\n subdivisions: 18,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 120,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.14,\n shading: 0.18,\n rayTracing: 0,\n updateCadence: 0.12,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): FluidRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Fluid range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n fluidBodyId: string,\n kind: FluidBodyKind,\n profile: FluidProfileName,\n band: FluidRepresentationBand,\n supportsRayTracing: boolean,\n thresholds: FluidRangeThresholds,\n options: FluidRepresentationPlanOptions\n): FluidRepresentationDescriptor {\n const continuityEnvelope = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${fluidBodyId}.${band}.${profileSpec.output}`,\n fluidBodyId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n waveFieldId: continuityEnvelope.waveFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n amplitudeFloor: continuity.amplitudeFloor,\n frequencyFloor: continuity.frequencyFloor,\n retainFoamHistory: continuity.retainFoamHistory,\n retainLowFrequencyWaves: continuity.retainLowFrequencyWaves,\n retainDirectionality: continuity.retainDirectionality,\n }),\n performance: Object.freeze({\n ...profileSpec.performance,\n importanceSignals: Object.freeze({\n ...profileSpec.performance.importanceSignals,\n visible: band === \"near\" ? true : thresholds.nearMaxMeters > 0,\n }),\n }),\n });\n}\n\n/**\n * Selects the active fluid representation band for a given distance.\n */\nexport function selectFluidRepresentationBand(\n distanceMeters: number,\n thresholds: FluidRangeThresholds\n): FluidRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware fluid representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createFluidRepresentationPlan(\n options: FluidRepresentationPlanOptions\n): FluidRepresentationPlan {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", options.fluidBodyId);\n const kind = options.kind\n ? normalizeFluidBodyKind(options.kind)\n : \"ocean\";\n const profile = options.profile\n ? normalizeFluidProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 40,\n options.midFieldMaxMeters ?? 160,\n options.farFieldMaxMeters ?? 700\n );\n const continuity = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: fluidRepresentationBands,\n representations: Object.freeze(\n fluidRepresentationBands.map((band) =>\n buildRepresentationDescriptor(\n fluidBodyId,\n kind,\n profile,\n band,\n supportsRayTracing,\n thresholds,\n options\n )\n )\n ),\n });\n}\n","import type {\n FluidPerformanceDomain,\n FluidPerformanceImportanceSignals,\n FluidPerformanceQualityDimensions,\n FluidProfileName,\n FluidRepresentationBand,\n FluidSimulationPlan,\n FluidSimulationPlanStage,\n FluidSimulationStageId,\n FluidWorkerAuthority,\n FluidWorkerBudgetLevel,\n FluidWorkerImportance,\n FluidWorkerManifest,\n FluidWorkerManifestJob,\n FluidWorkerQueueClass,\n} from \"./types.js\";\nimport { fluidProfileNames, fluidRepresentationBands } from \"./types.js\";\nimport { normalizeFluidProfile } from \"./validation.js\";\n\nexport const fluidDebugOwner = \"fluid\";\nexport const defaultFluidProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<FluidSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"spectrum-advance\": \"Advance shared wave spectrum\",\n \"boundary-coupling\": \"Resolve boundaries and buoyancy coupling\",\n \"surface-solve\": \"Solve fluid surface state\",\n \"near-surface\": \"Prepare near-field live surface\",\n \"mid-surface\": \"Prepare mid-field simplified surface\",\n \"far-proxy\": \"Prepare far-field merged proxy\",\n \"horizon-shell\": \"Prepare horizon shell\",\n \"foam-history\": \"Propagate foam and crest history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: FluidSimulationPlanStage\n): FluidSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: FluidWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly FluidWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"fluid\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: FluidProfileName,\n key: string,\n spec: WorkerJobSpec\n): FluidWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"fluid\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"fluid\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive fluid profile that preserves stable snapshot coupling while scaling distant surface cost before near-field continuity.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.spectrum\",\n \"fluid.surface.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"fluid.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.snapshot\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"spectrum-advance\": Object.freeze({\n label: \"fluid.spectrum-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.spectrum\"]),\n levels: {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"boundary-coupling\": Object.freeze({\n label: \"fluid.boundary-coupling\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.boundary\"]),\n levels: {\n low: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"surface-solve\": Object.freeze({\n label: \"fluid.surface-solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"boundary-coupling\", \"spectrum-advance\"]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.surface.solve\"]),\n levels: {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 2.1,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"near-surface\": Object.freeze({\n label: \"fluid.near-surface\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.near\"]),\n levels: {\n low: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 2.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"mid-surface\": Object.freeze({\n label: \"fluid.mid-surface\",\n queueClass: \"render\",\n priority: 330,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.mid\"]),\n levels: {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 1.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.9,\n maxQueueDepth: 128,\n },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"fluid.far-proxy\",\n queueClass: \"render\",\n priority: 220,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.far\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.4,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 4,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 3,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n },\n }),\n \"horizon-shell\": Object.freeze({\n label: \"fluid.horizon-shell\",\n queueClass: \"render\",\n priority: 120,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.horizon\"]),\n levels: {\n low: {\n estimatedCostMs: 0.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 10,\n workgroupScale: 0.25,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.18,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 8,\n workgroupScale: 0.35,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.28,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n },\n }),\n \"foam-history\": Object.freeze({\n label: \"fluid.foam-history\",\n queueClass: \"render\",\n priority: 310,\n dependencies: Object.freeze([\"near-surface\", \"mid-surface\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n shading: 0.6,\n updateCadence: 0.6,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.foam\"]),\n levels: {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 1,\n workgroupScale: 0.85,\n maxQueueDepth: 96,\n },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic fluid profile that spends more budget on near and mid-field continuity before degrading distant fluid work.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.surface.near\",\n \"fluid.surface.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-surface\" || key === \"mid-surface\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: {\n ...spec.levels.low,\n estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)),\n },\n medium: {\n ...spec.levels.medium,\n estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)),\n },\n high: {\n ...spec.levels.high,\n estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)),\n },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst fluidWorkerProfileSpecs: Readonly<Record<FluidProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n [\n createSimulationStage({\n id: \"snapshot-ingest\",\n label: simulationStageLabels[\"snapshot-ingest\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"physics-snapshot\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"spectrum-advance\",\n label: simulationStageLabels[\"spectrum-advance\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"wave-spectrum\",\n snapshotStable: false,\n }),\n createSimulationStage({\n id: \"boundary-coupling\",\n label: simulationStageLabels[\"boundary-coupling\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"snapshot-ingest\"],\n output: \"boundary-constraints\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"surface-solve\",\n label: simulationStageLabels[\"surface-solve\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"boundary-coupling\", \"spectrum-advance\"],\n output: \"surface-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"near-surface\",\n label: simulationStageLabels[\"near-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"near-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"mid-surface\",\n label: simulationStageLabels[\"mid-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"mid-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"far-proxy\",\n label: simulationStageLabels[\"far-proxy\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"far-proxy-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"horizon-shell\",\n label: simulationStageLabels[\"horizon-shell\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"horizon-shell-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"foam-history\",\n label: simulationStageLabels[\"foam-history\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"near-surface\", \"mid-surface\"],\n output: \"foam-history-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"render-snapshot\",\n label: simulationStageLabels[\"render-snapshot\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n ],\n output: \"fluid-render-snapshot\",\n snapshotStable: true,\n }),\n ]\n);\n\nconst cinematicSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-shell\"\n ? Object.freeze({\n ...stage,\n output: stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-shell-representation-cinematic\",\n })\n : stage\n )\n);\n\nconst fluidSimulationPlanSpecs: Readonly<\n Record<FluidProfileName, readonly FluidSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected fluid profile.\n */\nexport function getFluidWorkerManifest(\n profile: FluidProfileName = defaultFluidProfile\n): FluidWorkerManifest {\n const profileName = normalizeFluidProfile(profile);\n const spec = fluidWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level fluid simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createFluidSimulationPlan(\n profile: FluidProfileName = defaultFluidProfile\n): FluidSimulationPlan {\n const profileName = normalizeFluidProfile(profile);\n const stages = fluidSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n description: fluidWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-spectrum\",\n requiresSharedWaveField: true,\n bands: fluidRepresentationBands,\n }),\n stages,\n });\n}\n","const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\nexport const lightingDistanceBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nconst lightingImportanceLevels = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\nconst lightingBandPolicySpecs = Object.freeze({\n near: Object.freeze({\n primaryShadowSource: \"ray-traced-primary\",\n assistShadowSources: Object.freeze([\"visibility-raster\", \"shadow-map-assist\"]),\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n mid: Object.freeze({\n primaryShadowSource: \"selective-raster-and-proxy\",\n assistShadowSources: Object.freeze([\n \"regional-shadow-map\",\n \"proxy-caster\",\n \"temporal-history\",\n ]),\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n far: Object.freeze({\n primaryShadowSource: \"merged-proxy-casters\",\n assistShadowSources: Object.freeze([\n \"coarse-directional\",\n \"semi-static-occlusion\",\n ]),\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n liveObjectShadows: false,\n impressionOnly: false,\n }),\n horizon: Object.freeze({\n primaryShadowSource: \"baked-impression\",\n assistShadowSources: Object.freeze([\"atmospheric-gradient\", \"skyline-darkening\"]),\n temporalReuse: \"baked\",\n updateCadenceDivisor: 60,\n liveObjectShadows: false,\n impressionOnly: true,\n }),\n});\n\nfunction assertLightingImportance(name, value) {\n if (!lightingImportanceLevels.includes(value)) {\n throw new Error(\n `${name} must be one of: ${lightingImportanceLevels.join(\", \")}.`\n );\n }\n return value;\n}\n\nfunction resolveBandParticipation(profileName, band, importance) {\n const referenceProfile = profileName === \"reference\";\n const premiumImportance =\n importance === \"critical\" || importance === \"high\";\n\n if (band === \"near\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"premium\" : \"selective\",\n reflections: premiumImportance ? \"premium\" : \"selective\",\n globalIllumination:\n referenceProfile || importance === \"critical\" ? \"premium\" : \"selective\",\n });\n }\n\n if (band === \"mid\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"selective\" : \"proxy\",\n reflections:\n referenceProfile && premiumImportance ? \"selective\" : \"proxy\",\n globalIllumination:\n referenceProfile && importance === \"critical\" ? \"selective\" : \"disabled\",\n });\n }\n\n if (band === \"far\") {\n return Object.freeze({\n directShadows: \"proxy\",\n reflections:\n referenceProfile && importance === \"critical\" ? \"proxy\" : \"disabled\",\n globalIllumination: \"disabled\",\n });\n }\n\n return Object.freeze({\n directShadows: \"disabled\",\n reflections: \"disabled\",\n globalIllumination: \"disabled\",\n });\n}\n\nexport function createLightingBandPlan(options = {}) {\n const profileName = options.profile ?? defaultLightingProfile;\n const profile = getLightingProfile(profileName);\n const importance = assertLightingImportance(\n \"importance\",\n options.importance ?? \"high\"\n );\n\n const bands = Object.freeze(\n lightingDistanceBands.map((band) =>\n Object.freeze({\n band,\n profile: profile.name,\n importance,\n primaryShadowSource: lightingBandPolicySpecs[band].primaryShadowSource,\n assistShadowSources: Object.freeze([\n ...lightingBandPolicySpecs[band].assistShadowSources,\n ]),\n rtParticipation: resolveBandParticipation(profile.name, band, importance),\n temporalReuse: lightingBandPolicySpecs[band].temporalReuse,\n updateCadenceDivisor: lightingBandPolicySpecs[band].updateCadenceDivisor,\n liveObjectShadows: lightingBandPolicySpecs[band].liveObjectShadows,\n impressionOnly: lightingBandPolicySpecs[band].impressionOnly,\n })\n )\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n importance,\n techniques: Object.freeze([...profile.techniques]),\n bands,\n });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction resolveLightingQualityDimensions(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { shadows: 1, lightingSamples: 0.7 },\n \"hybrid.screenTrace\": { rayTracing: 1, temporalReuse: 0.4 },\n \"hybrid.radianceCache\": {\n lightingSamples: 0.8,\n updateCadence: 0.7,\n temporalReuse: 1,\n },\n \"hybrid.finalGather\": { lightingSamples: 1, rayTracing: 0.6 },\n \"hybrid.reflectionResolve\": {\n rayTracing: 0.5,\n temporalReuse: 1,\n shading: 0.3,\n },\n \"pathtracer.pathTrace\": { rayTracing: 1, lightingSamples: 1 },\n \"pathtracer.accumulate\": { temporalReuse: 1, updateCadence: 0.4 },\n \"pathtracer.denoise\": { temporalReuse: 1, shading: 0.4 },\n \"volumetrics.froxelIntegrate\": {\n lightingSamples: 0.6,\n shading: 0.4,\n updateCadence: 0.3,\n },\n \"volumetrics.volumetricShadow\": { shadows: 0.8, updateCadence: 0.5 },\n \"hdri.irradianceConvolution\": {\n lightingSamples: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.specularPrefilter\": {\n lightingSamples: 0.5,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.brdfLut\": {\n shading: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n }[key] ?? {}\n );\n}\n\nfunction resolveLightingImportanceSignals(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { visible: true, shadowSignificance: \"high\" },\n \"hybrid.screenTrace\": { visible: true, reflectionSignificance: \"high\" },\n \"hybrid.radianceCache\": { visible: true },\n \"hybrid.finalGather\": {\n visible: true,\n shadowSignificance: \"critical\",\n reflectionSignificance: \"high\",\n },\n \"hybrid.reflectionResolve\": { visible: true, reflectionSignificance: \"high\" },\n \"pathtracer.pathTrace\": {\n visible: true,\n shadowSignificance: \"high\",\n reflectionSignificance: \"high\",\n },\n \"pathtracer.accumulate\": { visible: true },\n \"pathtracer.denoise\": { visible: true },\n \"volumetrics.froxelIntegrate\": { visible: true },\n \"volumetrics.volumetricShadow\": { visible: true, shadowSignificance: \"high\" },\n \"hdri.irradianceConvolution\": { visible: false },\n \"hdri.specularPrefilter\": { visible: false, reflectionSignificance: \"medium\" },\n \"hdri.brdfLut\": { visible: false },\n }[key] ?? {}\n );\n}\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n qualityDimensions: resolveLightingQualityDimensions(techniqueName, job.key),\n importanceSignals: resolveLightingImportanceSignals(techniqueName, job.key),\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n const lightingBandPlan = createLightingBandPlan({ profile: profile.name });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n lightingBands: lightingBandPlan.bands,\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n lightingBandPlan: createLightingBandPlan({ profile: profile.name }),\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n","import type {\n DeviceClass,\n GpuTier,\n ModuleAuthority,\n ModuleImportance,\n PerformanceDomain,\n RuntimeMode,\n ThermalState,\n WorkerJobQueueClass,\n WorkerSchedulerMode,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const runtimeModes = Object.freeze([\n \"flat\",\n \"immersive-vr\",\n \"immersive-ar\",\n]) satisfies readonly RuntimeMode[];\n\nexport const deviceClasses = Object.freeze([\n \"mobile\",\n \"tablet\",\n \"desktop\",\n \"xr-headset\",\n \"unknown\",\n]) satisfies readonly DeviceClass[];\n\nexport const gpuTiers = Object.freeze([\n \"low\",\n \"mid\",\n \"high\",\n \"ultra\",\n \"unknown\",\n]) satisfies readonly GpuTier[];\n\nexport const thermalStates = Object.freeze([\n \"nominal\",\n \"fair\",\n \"serious\",\n \"critical\",\n]) satisfies readonly ThermalState[];\n\nexport const performanceDomains = Object.freeze([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]) satisfies readonly PerformanceDomain[];\n\nexport const moduleAuthorities = Object.freeze([\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n]) satisfies readonly ModuleAuthority[];\n\nexport const moduleImportances = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]) satisfies readonly ModuleImportance[];\n\nexport const workerJobQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"custom\",\n]) satisfies readonly WorkerJobQueueClass[];\n\nexport const workerSchedulerModes = Object.freeze([\n \"flat\",\n \"dag\",\n]) satisfies readonly WorkerSchedulerMode[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Ensures a value is one of the allowed string literal members.\n */\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(\n `${name} must be one of: ${allowedValues.join(\", \")}.`\n );\n }\n\n return value as T;\n}\n\n/**\n * Validates numeric input that must be finite and greater than zero.\n */\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\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\n return value;\n}\n\n/**\n * Validates numeric input that must be finite and zero or greater.\n */\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\n/**\n * Validates bounded identifier strings used for module and frame ids.\n */\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\n/**\n * Validates that a value is a plain object and returns a shallow-frozen copy.\n */\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\n/**\n * Validates bounded arrays of positive numeric buckets.\n */\nexport function readFrameRateBuckets(\n name: string,\n value: unknown,\n maxEntries = 16\n): number[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of frame-rate numbers.`);\n }\n\n if (value.length > maxEntries) {\n throw new Error(`${name} cannot contain more than ${maxEntries} entries.`);\n }\n\n return value.map((entry, index) => {\n const parsed = readPositiveNumber(`${name}[${index}]`, entry);\n return Math.round(parsed ?? 0);\n });\n}\n\n/**\n * Best-effort validation for AbortSignal-like objects without depending on a specific runtime implementation.\n */\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n","import type {\n DeviceProfile,\n DeviceProfileInput,\n FrameTargetNegotiationOptions,\n FrameTargetProfile,\n RuntimeMode,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n deviceClasses,\n gpuTiers,\n normalizePlainObject,\n readFrameRateBuckets,\n readPositiveNumber,\n runtimeModes,\n thermalStates,\n} from \"./validation.js\";\n\nconst DEFAULT_FRAME_RATE_BUCKETS = Object.freeze([120, 90, 72, 60, 45, 36, 30]);\n\nfunction uniqueSortedFrameRates(values: readonly number[]): number[] {\n if (values.length === 0) {\n return [];\n }\n\n return [...new Set(values.map((value) => Math.round(value)))].sort(\n (left, right) => right - left\n );\n}\n\nfunction defaultModeForDevice(deviceClass: DeviceProfileInput[\"deviceClass\"]): RuntimeMode {\n return deviceClass === \"xr-headset\" ? \"immersive-vr\" : \"flat\";\n}\n\n/**\n * Normalizes the caller-supplied device profile into a deterministic runtime profile.\n */\nexport function createDeviceProfile(input: DeviceProfileInput = {}): DeviceProfile {\n const deviceClass =\n input.deviceClass === undefined\n ? \"unknown\"\n : assertEnumValue(\"deviceClass\", input.deviceClass, deviceClasses);\n const mode =\n input.mode === undefined\n ? defaultModeForDevice(deviceClass)\n : assertEnumValue(\"mode\", input.mode, runtimeModes);\n const defaultRefreshRateHz = mode === \"flat\" ? 60 : 72;\n const refreshRateHz =\n readPositiveNumber(\"refreshRateHz\", input.refreshRateHz) ?? defaultRefreshRateHz;\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", input.supportedFrameRates)\n );\n const metadata = normalizePlainObject(\"metadata\", input.metadata);\n\n return Object.freeze({\n deviceClass,\n mode,\n refreshRateHz,\n supportedFrameRates: Object.freeze(\n supportedFrameRates.length > 0 ? supportedFrameRates : [refreshRateHz]\n ),\n gpuTier:\n input.gpuTier === undefined\n ? \"unknown\"\n : assertEnumValue(\"gpuTier\", input.gpuTier, gpuTiers),\n supportsWebGpu: input.supportsWebGpu ?? true,\n supportsFoveation: input.supportsFoveation ?? false,\n thermalState:\n input.thermalState === undefined\n ? \"nominal\"\n : assertEnumValue(\"thermalState\", input.thermalState, thermalStates),\n metadata,\n });\n}\n\n/**\n * Negotiates a device-specific frame target and guardrails for the adaptive governor.\n */\nexport function negotiateFrameTarget(\n options: FrameTargetNegotiationOptions = {}\n): FrameTargetProfile {\n const mode =\n options.mode === undefined\n ? \"flat\"\n : assertEnumValue(\"mode\", options.mode, runtimeModes);\n const minimumFrameRate = Math.round(\n readPositiveNumber(\"minimumFrameRate\", options.minimumFrameRate) ?? 60\n );\n const maximumFrameRate = readPositiveNumber(\n \"maximumFrameRate\",\n options.maximumFrameRate\n );\n const deviceRefreshRateHz = readPositiveNumber(\n \"deviceRefreshRateHz\",\n options.deviceRefreshRateHz\n );\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", options.supportedFrameRates)\n );\n const preferredFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"preferredFrameRates\", options.preferredFrameRates)\n );\n\n if (maximumFrameRate !== undefined && maximumFrameRate < minimumFrameRate) {\n throw new Error(\"maximumFrameRate must be greater than or equal to minimumFrameRate.\");\n }\n\n const rationale: string[] = [];\n\n const candidateFrameRates = uniqueSortedFrameRates([\n ...preferredFrameRates,\n ...supportedFrameRates,\n ...DEFAULT_FRAME_RATE_BUCKETS,\n ]).filter((rate) => {\n if (maximumFrameRate && rate > maximumFrameRate) {\n return false;\n }\n\n if (deviceRefreshRateHz && rate > deviceRefreshRateHz) {\n return false;\n }\n\n return true;\n });\n\n let targetFrameRate =\n candidateFrameRates.find((rate) => rate >= minimumFrameRate) ??\n candidateFrameRates[0] ??\n deviceRefreshRateHz ??\n minimumFrameRate;\n\n if (\n mode !== \"flat\" &&\n deviceRefreshRateHz &&\n supportedFrameRates.includes(Math.round(deviceRefreshRateHz))\n ) {\n targetFrameRate = Math.round(deviceRefreshRateHz);\n rationale.push(\n `Using native ${targetFrameRate} Hz immersive session target supported by the device.`\n );\n } else if (targetFrameRate >= minimumFrameRate) {\n rationale.push(\n `Selected ${targetFrameRate} FPS from the negotiated device frame-rate bucket set.`\n );\n } else {\n rationale.push(\n `Device could not meet the requested ${minimumFrameRate} FPS floor, falling back to ${targetFrameRate} FPS.`\n );\n }\n\n if (mode === \"flat\") {\n rationale.push(\"Flat mode keeps a 60 FPS floor by default and negotiates upward.\");\n } else {\n rationale.push(\"Immersive modes prefer headset-native cadence when the session supports it.\");\n }\n\n const targetFrameTimeMs = 1000 / targetFrameRate;\n const downgradeMultiplier = mode === \"flat\" ? 1.05 : 1.03;\n const upgradeMultiplier = mode === \"flat\" ? 0.92 : 0.95;\n\n return Object.freeze({\n mode,\n minimumFrameRate,\n targetFrameRate,\n targetFrameTimeMs,\n downgradeFrameTimeMs: targetFrameTimeMs * downgradeMultiplier,\n upgradeFrameTimeMs: targetFrameTimeMs * upgradeMultiplier,\n candidateFrameRates: Object.freeze(candidateFrameRates),\n rationale: Object.freeze(rationale),\n });\n}\n","import type {\n MotionClass,\n PerformanceBudgetMetadata,\n PerformanceImportanceSignals,\n PerformanceQualityDimensions,\n QualityDimension,\n RepresentationBand,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n moduleImportances,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nexport const representationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]) satisfies readonly RepresentationBand[];\n\nexport const rayTracingQualityDimensions = Object.freeze([\n \"geometry\",\n \"animation\",\n \"deformation\",\n \"shading\",\n \"shadows\",\n \"rayTracing\",\n \"lightingSamples\",\n \"updateCadence\",\n \"temporalReuse\",\n]) satisfies readonly QualityDimension[];\n\nexport const motionClasses = Object.freeze([\n \"stable\",\n \"dynamic\",\n \"volatile\",\n]) satisfies readonly MotionClass[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeQualityDimensions(\n name: string,\n value: unknown\n): PerformanceQualityDimensions {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized = Object.fromEntries(\n Object.entries(value).flatMap(([key, rawValue]) => {\n const dimension = assertEnumValue(\n `${name}.${key}`,\n key,\n rayTracingQualityDimensions\n );\n const weight = readNonNegativeNumber(`${name}.${key}`, rawValue) ?? 0;\n return weight > 0 ? [[dimension, weight]] : [];\n })\n );\n\n return Object.freeze(normalized);\n}\n\nfunction normalizeImportanceSignals(\n name: string,\n value: unknown\n): Readonly<PerformanceImportanceSignals> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized: PerformanceImportanceSignals = {};\n\n if (value.visible !== undefined) {\n if (typeof value.visible !== \"boolean\") {\n throw new Error(`${name}.visible must be a boolean when provided.`);\n }\n normalized.visible = value.visible;\n }\n\n if (value.playerRelevant !== undefined) {\n if (typeof value.playerRelevant !== \"boolean\") {\n throw new Error(`${name}.playerRelevant must be a boolean when provided.`);\n }\n normalized.playerRelevant = value.playerRelevant;\n }\n\n if (value.imageCritical !== undefined) {\n if (typeof value.imageCritical !== \"boolean\") {\n throw new Error(`${name}.imageCritical must be a boolean when provided.`);\n }\n normalized.imageCritical = value.imageCritical;\n }\n\n if (value.motionClass !== undefined) {\n normalized.motionClass = assertEnumValue(\n `${name}.motionClass`,\n value.motionClass,\n motionClasses\n );\n }\n\n if (value.shadowSignificance !== undefined) {\n normalized.shadowSignificance = assertEnumValue(\n `${name}.shadowSignificance`,\n value.shadowSignificance,\n moduleImportances\n );\n }\n\n if (value.reflectionSignificance !== undefined) {\n normalized.reflectionSignificance = assertEnumValue(\n `${name}.reflectionSignificance`,\n value.reflectionSignificance,\n moduleImportances\n );\n }\n\n return Object.freeze(normalized);\n}\n\nexport function normalizePerformanceBudgetMetadata(\n name: string,\n value: unknown\n): Required<Omit<PerformanceBudgetMetadata, \"representationBand\">> &\n Pick<PerformanceBudgetMetadata, \"representationBand\"> {\n const source = isPlainObject(value) ? value : {};\n const representationBand =\n source.representationBand === undefined\n ? undefined\n : assertEnumValue(\n `${name}.representationBand`,\n source.representationBand,\n representationBands\n );\n\n return Object.freeze({\n representationBand,\n qualityDimensions: normalizeQualityDimensions(\n `${name}.qualityDimensions`,\n source.qualityDimensions\n ),\n importanceSignals: normalizeImportanceSignals(\n `${name}.importanceSignals`,\n source.importanceSignals\n ),\n });\n}\n","import { createDeviceProfile, negotiateFrameTarget } from \"./device.js\";\nimport type {\n FrameSample,\n GovernorAdaptationOptions,\n GovernorDecision,\n GovernorErrorRecord,\n GovernorMetrics,\n GovernorState,\n GovernorWorkerGraphSummary,\n GpuPerformanceGovernorOptions,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceGovernor,\n PerformanceModuleAdapter,\n PerformanceModuleSnapshot,\n PressureLevel,\n ThermalState,\n} from \"./types.js\";\nimport {\n assertIdentifier,\n isAbortSignalLike,\n performanceDomains,\n readNonNegativeNumber,\n readPositiveNumber,\n thermalStates,\n} from \"./validation.js\";\n\nconst MAX_MODULE_COUNT = 128;\nconst MAX_SAMPLE_WINDOW_SIZE = 240;\n\nexport const defaultDomainOrder = Object.freeze<readonly PerformanceDomain[]>([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]);\n\nconst DEFAULT_ADAPTATION_OPTIONS = Object.freeze<Required<GovernorAdaptationOptions>>({\n sampleWindowSize: 24,\n minimumSamplesBeforeAdjustment: 8,\n degradeCooldownFrames: 6,\n upgradeCooldownFrames: 24,\n minStableFramesForRecovery: 10,\n trendSensitivityMs: 0.35,\n emaAlpha: 0.25,\n maxStepChangesPerCycle: 2,\n allowAuthoritativeScaling: false,\n domainOrder: defaultDomainOrder,\n maxRetainedErrors: 50,\n maxRetainedFrameIds: 512,\n});\n\nfunction clampPositiveInteger(\n value: number | undefined,\n fallback: number,\n maximum?: number\n): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n const rounded = Math.round(value);\n return maximum ? Math.min(rounded, maximum) : rounded;\n}\n\nfunction clampRatio(value: number | undefined, fallback: number): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value <= 0 ||\n value >= 1\n ) {\n return fallback;\n }\n\n return value;\n}\n\nfunction buildAdaptationOptions(\n options: GovernorAdaptationOptions | undefined\n): Required<GovernorAdaptationOptions> {\n const domainOrder =\n options?.domainOrder?.length && options.domainOrder.length <= performanceDomains.length\n ? [...new Set(options.domainOrder)]\n : DEFAULT_ADAPTATION_OPTIONS.domainOrder;\n\n return {\n sampleWindowSize: clampPositiveInteger(\n options?.sampleWindowSize,\n DEFAULT_ADAPTATION_OPTIONS.sampleWindowSize,\n MAX_SAMPLE_WINDOW_SIZE\n ),\n minimumSamplesBeforeAdjustment: clampPositiveInteger(\n options?.minimumSamplesBeforeAdjustment,\n DEFAULT_ADAPTATION_OPTIONS.minimumSamplesBeforeAdjustment\n ),\n degradeCooldownFrames: clampPositiveInteger(\n options?.degradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.degradeCooldownFrames\n ),\n upgradeCooldownFrames: clampPositiveInteger(\n options?.upgradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.upgradeCooldownFrames\n ),\n minStableFramesForRecovery: clampPositiveInteger(\n options?.minStableFramesForRecovery,\n DEFAULT_ADAPTATION_OPTIONS.minStableFramesForRecovery\n ),\n trendSensitivityMs:\n typeof options?.trendSensitivityMs === \"number\" &&\n Number.isFinite(options.trendSensitivityMs) &&\n options.trendSensitivityMs > 0\n ? options.trendSensitivityMs\n : DEFAULT_ADAPTATION_OPTIONS.trendSensitivityMs,\n emaAlpha: clampRatio(options?.emaAlpha, DEFAULT_ADAPTATION_OPTIONS.emaAlpha),\n maxStepChangesPerCycle: clampPositiveInteger(\n options?.maxStepChangesPerCycle,\n DEFAULT_ADAPTATION_OPTIONS.maxStepChangesPerCycle\n ),\n allowAuthoritativeScaling:\n options?.allowAuthoritativeScaling ??\n DEFAULT_ADAPTATION_OPTIONS.allowAuthoritativeScaling,\n domainOrder,\n maxRetainedErrors: clampPositiveInteger(\n options?.maxRetainedErrors,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedErrors\n ),\n maxRetainedFrameIds: clampPositiveInteger(\n options?.maxRetainedFrameIds,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedFrameIds\n ),\n };\n}\n\nfunction averageOf(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction percentile(values: readonly number[], ratio: number): number {\n if (values.length === 0) {\n return 0;\n }\n\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(\n sorted.length - 1,\n Math.max(0, Math.ceil(sorted.length * ratio) - 1)\n );\n\n return sorted[index] ?? 0;\n}\n\nfunction averageFrameMetric(\n samples: readonly FrameSample[],\n key: \"cpuTimeMs\" | \"gpuTimeMs\"\n) {\n const values = samples\n .map((sample) => sample[key])\n .filter((value): value is number => typeof value === \"number\");\n\n return averageOf(values);\n}\n\nfunction computeTrendDelta(samples: readonly FrameSample[]): number {\n if (samples.length < 4) {\n return 0;\n }\n\n const midpoint = Math.floor(samples.length / 2);\n const older = samples.slice(0, midpoint).map((sample) => sample.frameTimeMs);\n const newer = samples.slice(midpoint).map((sample) => sample.frameTimeMs);\n const olderAverage = averageOf(older) ?? 0;\n const newerAverage = averageOf(newer) ?? 0;\n return newerAverage - olderAverage;\n}\n\nfunction createMetrics(\n samples: readonly FrameSample[],\n emaFrameTimeMs: number,\n targetFrameTimeMs: number,\n thermalState: ThermalState\n): GovernorMetrics {\n const frameTimes = samples.map((sample) => sample.frameTimeMs);\n const latestFrameTimeMs = frameTimes[frameTimes.length - 1] ?? targetFrameTimeMs;\n const averageFrameTimeMs = averageOf(frameTimes) ?? targetFrameTimeMs;\n const fps = averageFrameTimeMs > 0 ? 1000 / averageFrameTimeMs : 0;\n const p95FrameTimeMs = percentile(frameTimes, 0.95);\n const dropRatio =\n samples.filter(\n (sample) =>\n sample.dropped === true || sample.frameTimeMs > targetFrameTimeMs * 1.1\n ).length / Math.max(1, samples.length);\n\n return {\n sampleCount: samples.length,\n fps,\n latestFrameTimeMs,\n averageFrameTimeMs,\n emaFrameTimeMs,\n p95FrameTimeMs,\n averageCpuTimeMs: averageFrameMetric(samples, \"cpuTimeMs\"),\n averageGpuTimeMs: averageFrameMetric(samples, \"gpuTimeMs\"),\n targetFrameTimeMs,\n frameTimeDeltaMs: averageFrameTimeMs - targetFrameTimeMs,\n trendDeltaMs: computeTrendDelta(samples),\n dropRatio,\n thermalState,\n };\n}\n\nfunction classifyPressure(\n metrics: GovernorMetrics,\n downgradeFrameTimeMs: number,\n upgradeFrameTimeMs: number,\n trendSensitivityMs: number\n): PressureLevel {\n if (\n metrics.thermalState === \"critical\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.latestFrameTimeMs >= metrics.targetFrameTimeMs * 1.5 ||\n metrics.dropRatio >= 0.35\n ) {\n return \"starved\";\n }\n\n if (\n metrics.thermalState === \"serious\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.12 ||\n metrics.p95FrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.trendDeltaMs >= trendSensitivityMs * 1.5\n ) {\n return \"critical\";\n }\n\n if (\n metrics.thermalState === \"fair\" ||\n metrics.averageFrameTimeMs >= downgradeFrameTimeMs ||\n metrics.trendDeltaMs >= trendSensitivityMs ||\n metrics.dropRatio >= 0.1\n ) {\n return \"elevated\";\n }\n\n if (\n metrics.averageFrameTimeMs <= upgradeFrameTimeMs &&\n metrics.trendDeltaMs <= 0 &&\n metrics.dropRatio <= 0.05\n ) {\n return \"recovering\";\n }\n\n return \"stable\";\n}\n\nfunction domainRank(\n domain: PerformanceDomain,\n domainOrder: readonly PerformanceDomain[]\n): number {\n const index = domainOrder.indexOf(domain);\n return index >= 0 ? index : domainOrder.length + 1;\n}\n\ntype WorkerDagSnapshot = PerformanceModuleSnapshot & {\n priority: number;\n dependencies: readonly string[];\n dependents: readonly string[];\n dependencyCount: number;\n unresolvedDependencyCount: number;\n dependentCount: number;\n root: boolean;\n schedulerMode: \"flat\" | \"dag\";\n};\n\nfunction toWorkerDagSnapshot(\n snapshot: PerformanceModuleSnapshot\n): WorkerDagSnapshot | null {\n if (\n typeof (snapshot as { priority?: unknown }).priority !== \"number\" ||\n !Array.isArray((snapshot as { dependencies?: unknown }).dependencies) ||\n !Array.isArray((snapshot as { dependents?: unknown }).dependents) ||\n typeof (snapshot as { dependencyCount?: unknown }).dependencyCount !== \"number\" ||\n typeof (snapshot as { unresolvedDependencyCount?: unknown }).unresolvedDependencyCount !==\n \"number\" ||\n typeof (snapshot as { dependentCount?: unknown }).dependentCount !== \"number\" ||\n typeof (snapshot as { root?: unknown }).root !== \"boolean\" ||\n ((snapshot as { schedulerMode?: unknown }).schedulerMode !== \"flat\" &&\n (snapshot as { schedulerMode?: unknown }).schedulerMode !== \"dag\")\n ) {\n return null;\n }\n\n return snapshot as WorkerDagSnapshot;\n}\n\nconst representationBandProtectionScores = Object.freeze({\n near: 140,\n mid: 80,\n far: 20,\n horizon: 0,\n});\n\nconst motionProtectionScores = Object.freeze({\n stable: 0,\n dynamic: 12,\n volatile: 24,\n});\n\nconst dimensionBiasScores = Object.freeze({\n geometry: 22,\n animation: 16,\n deformation: 20,\n shading: 10,\n shadows: 8,\n rayTracing: 4,\n lightingSamples: -8,\n updateCadence: -24,\n temporalReuse: -20,\n});\n\nfunction importanceWeight(value: string | undefined): number {\n return value === \"critical\"\n ? 20\n : value === \"high\"\n ? 12\n : value === \"medium\"\n ? 6\n : 0;\n}\n\nfunction rankBudgetMetadata(snapshot: PerformanceModuleSnapshot): number {\n const representationBand =\n snapshot.representationBand &&\n snapshot.representationBand in representationBandProtectionScores\n ? snapshot.representationBand\n : undefined;\n const qualityDimensions =\n snapshot.qualityDimensions && typeof snapshot.qualityDimensions === \"object\"\n ? snapshot.qualityDimensions\n : {};\n const importanceSignals =\n snapshot.importanceSignals && typeof snapshot.importanceSignals === \"object\"\n ? snapshot.importanceSignals\n : {};\n\n const bandScore = representationBand\n ? representationBandProtectionScores[representationBand]\n : 0;\n const visibilityScore =\n (importanceSignals.visible ? 26 : 0) +\n (importanceSignals.playerRelevant ? 24 : 0) +\n (importanceSignals.imageCritical ? 18 : 0);\n const motionScore =\n importanceSignals.motionClass &&\n importanceSignals.motionClass in motionProtectionScores\n ? motionProtectionScores[importanceSignals.motionClass]\n : 0;\n const significanceScore =\n importanceWeight(importanceSignals.shadowSignificance) +\n importanceWeight(importanceSignals.reflectionSignificance);\n const dimensionScore = Object.entries(qualityDimensions).reduce(\n (total, [dimension, weight]) =>\n total +\n ((dimensionBiasScores as Record<string, number>)[dimension] ?? 0) *\n (typeof weight === \"number\" ? weight : 0),\n 0\n );\n\n return bandScore + visibilityScore + motionScore + significanceScore + dimensionScore;\n}\n\nfunction buildWorkerGraphSummary(\n snapshots: readonly PerformanceModuleSnapshot[]\n): GovernorWorkerGraphSummary | null {\n const dagSnapshots = snapshots\n .map((snapshot) => toWorkerDagSnapshot(snapshot))\n .filter((snapshot): snapshot is WorkerDagSnapshot => snapshot?.schedulerMode === \"dag\");\n\n if (dagSnapshots.length === 0) {\n return null;\n }\n\n const lanes = new Map<number, { priority: number; jobCount: number; rootCount: number; protectedJobCount: number }>();\n const roots: string[] = [];\n let protectedJobCount = 0;\n let maxPriority = 0;\n let maxDependentCount = 0;\n\n for (const snapshot of dagSnapshots) {\n if (snapshot.root) {\n roots.push(snapshot.id);\n }\n\n const isProtected =\n snapshot.authority === \"authoritative\" ||\n snapshot.root ||\n snapshot.priority > 0 ||\n snapshot.dependentCount > 0;\n if (isProtected) {\n protectedJobCount += 1;\n }\n\n maxPriority = Math.max(maxPriority, snapshot.priority);\n maxDependentCount = Math.max(maxDependentCount, snapshot.dependentCount);\n\n const lane = lanes.get(snapshot.priority) ?? {\n priority: snapshot.priority,\n jobCount: 0,\n rootCount: 0,\n protectedJobCount: 0,\n };\n lane.jobCount += 1;\n if (snapshot.root) {\n lane.rootCount += 1;\n }\n if (isProtected) {\n lane.protectedJobCount += 1;\n }\n lanes.set(snapshot.priority, lane);\n }\n\n return Object.freeze({\n schedulerMode: \"dag\",\n jobCount: dagSnapshots.length,\n rootCount: roots.length,\n protectedJobCount,\n degradableJobCount: dagSnapshots.length - protectedJobCount,\n maxPriority,\n maxDependentCount,\n roots: Object.freeze([...roots]),\n priorityLanes: Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobCount: lane.jobCount,\n rootCount: lane.rootCount,\n protectedJobCount: lane.protectedJobCount,\n })\n )\n ),\n });\n}\n\nfunction rankForDegrade(\n snapshot: PerformanceModuleSnapshot,\n domainOrder: readonly PerformanceDomain[],\n allowAuthoritativeScaling: boolean\n): number {\n if (snapshot.authority === \"authoritative\" && !allowAuthoritativeScaling) {\n return Number.POSITIVE_INFINITY;\n }\n\n const authorityScore =\n snapshot.authority === \"visual\"\n ? 0\n : snapshot.authority === \"non-authoritative-simulation\"\n ? 100\n : 300;\n const importanceScore =\n snapshot.importance === \"low\"\n ? 0\n : snapshot.importance === \"medium\"\n ? 20\n : snapshot.importance === \"high\"\n ? 40\n : 60;\n const costScore = -(snapshot.estimatedCostMs ?? 0);\n const workerDag = toWorkerDagSnapshot(snapshot);\n const dagProtectionScore =\n workerDag?.schedulerMode === \"dag\"\n ? (workerDag.root ? 120 : 0) +\n workerDag.priority * 25 +\n workerDag.dependentCount * 18\n : 0;\n const budgetMetadataScore = rankBudgetMetadata(snapshot);\n\n return (\n authorityScore +\n importanceScore +\n domainRank(snapshot.domain, domainOrder) * 10 +\n costScore +\n dagProtectionScore +\n budgetMetadataScore\n );\n}\n\nfunction buildReason(\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n): string {\n const average = metrics.averageFrameTimeMs.toFixed(2);\n const target = metrics.targetFrameTimeMs.toFixed(2);\n const trend = metrics.trendDeltaMs.toFixed(2);\n const graphNote =\n workerGraph && workerGraph.schedulerMode === \"dag\"\n ? ` DAG roots ${workerGraph.rootCount}/${workerGraph.jobCount}, max priority ${workerGraph.maxPriority}, max fan-out ${workerGraph.maxDependentCount}.`\n : \"\";\n return `${pressureLevel} pressure: avg ${average} ms vs target ${target} ms, trend delta ${trend} ms.${graphNote}`;\n}\n\nfunction sanitizeErrorMessage(error: unknown): string {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"Unexpected runtime failure.\";\n\n return message.replace(/\\s+/gu, \" \").trim().slice(0, 160) || \"Unexpected runtime failure.\";\n}\n\nfunction validateTelemetryHooks(\n telemetry: GpuPerformanceGovernorOptions[\"telemetry\"]\n): void {\n if (!telemetry) {\n return;\n }\n\n for (const [name, hook] of Object.entries(telemetry)) {\n if (hook !== undefined && typeof hook !== \"function\") {\n throw new Error(`telemetry.${name} must be a function when provided.`);\n }\n }\n}\n\nfunction validateFrameSample(sample: FrameSample): void {\n readPositiveNumber(\"frameTimeMs\", sample.frameTimeMs);\n readNonNegativeNumber(\"cpuTimeMs\", sample.cpuTimeMs);\n readNonNegativeNumber(\"gpuTimeMs\", sample.gpuTimeMs);\n readNonNegativeNumber(\"timestampMs\", sample.timestampMs);\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"dropped must be a boolean when provided.\");\n }\n\n if (sample.thermalState !== undefined && !thermalStates.includes(sample.thermalState)) {\n throw new Error(`thermalState must be one of: ${thermalStates.join(\", \")}.`);\n }\n\n if (sample.frameId !== undefined) {\n assertIdentifier(\"frameId\", sample.frameId);\n }\n\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"signal must be an AbortSignal-like object when provided.\");\n }\n}\n\nfunction validateModuleAdapter(module: PerformanceModuleAdapter): void {\n if (!module || typeof module !== \"object\") {\n throw new Error(\"modules entries must be objects that implement the adapter contract.\");\n }\n\n assertIdentifier(\"module.id\", module.id);\n\n if (typeof module.getSnapshot !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement getSnapshot().`);\n }\n\n if (typeof module.stepDown !== \"function\" || typeof module.stepUp !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement stepDown() and stepUp().`);\n }\n}\n\nfunction createErrorRecord(input: {\n cycle: number;\n source: GovernorErrorRecord[\"source\"];\n code: string;\n message: string;\n retryable: boolean;\n moduleId?: string;\n correlationId?: string;\n}): GovernorErrorRecord {\n return Object.freeze({\n cycle: input.cycle,\n source: input.source,\n code: input.code,\n message: input.message,\n retryable: input.retryable,\n moduleId: input.moduleId,\n correlationId: input.correlationId,\n });\n}\n\n/**\n * Creates the local closed-loop GPU performance governor.\n */\nexport function createGpuPerformanceGovernor(\n options: GpuPerformanceGovernorOptions\n): PerformanceGovernor {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"createGpuPerformanceGovernor requires an options object.\");\n }\n\n validateTelemetryHooks(options.telemetry);\n\n const device = createDeviceProfile(options.device);\n if (!device.supportsWebGpu) {\n throw new Error(\n \"WebGPU support is required to create the GPU performance governor.\"\n );\n }\n\n const adaptation = buildAdaptationOptions(options.adaptation);\n const target = negotiateFrameTarget({\n mode: options.target?.mode ?? device.mode,\n deviceRefreshRateHz: options.target?.deviceRefreshRateHz ?? device.refreshRateHz,\n supportedFrameRates:\n options.target?.supportedFrameRates ?? device.supportedFrameRates,\n preferredFrameRates: options.target?.preferredFrameRates,\n minimumFrameRate: options.target?.minimumFrameRate,\n maximumFrameRate: options.target?.maximumFrameRate,\n });\n\n const modules = new Map<string, PerformanceModuleAdapter>();\n if ((options.modules?.length ?? 0) > MAX_MODULE_COUNT) {\n throw new Error(`modules cannot contain more than ${MAX_MODULE_COUNT} adapters.`);\n }\n\n for (const module of options.modules ?? []) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Duplicate module id \"${module.id}\" detected.`);\n }\n modules.set(module.id, module);\n }\n\n let cycle = 0;\n let samples: FrameSample[] = [];\n let emaFrameTimeMs = target.targetFrameTimeMs;\n let lastThermalState = device.thermalState;\n let lastDecision: GovernorDecision | null = null;\n let stableRecoveryFrames = 0;\n let lastDownCycle = Number.NEGATIVE_INFINITY;\n let lastUpCycle = Number.NEGATIVE_INFINITY;\n let recoveryStack: string[] = [];\n let recentErrors: GovernorErrorRecord[] = [];\n let recentFrameIds = new Set<string>();\n let recentFrameIdQueue: string[] = [];\n\n const appendError = (error: GovernorErrorRecord, decisionErrors?: GovernorErrorRecord[]) => {\n if (decisionErrors) {\n decisionErrors.push(error);\n }\n\n recentErrors = [...recentErrors, error].slice(-adaptation.maxRetainedErrors);\n\n if (typeof options.telemetry?.onError === \"function\") {\n try {\n options.telemetry.onError(error);\n } catch {\n // Error reporting must never cause recursive runtime failure.\n }\n }\n };\n\n const emitTelemetry = <Payload>(\n hook: ((payload: Payload) => void) | undefined,\n payload: Payload,\n errorFactory: () => GovernorErrorRecord,\n decisionErrors?: GovernorErrorRecord[]\n ) => {\n if (typeof hook !== \"function\") {\n return;\n }\n\n try {\n hook(payload);\n } catch {\n appendError(errorFactory(), decisionErrors);\n }\n };\n\n emitTelemetry(\n options.telemetry?.onTargetNegotiated,\n target,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_TARGET_HOOK_FAILED\",\n message: \"Target-negotiated telemetry callback failed.\",\n retryable: true,\n })\n );\n\n const getModuleSnapshots = (): PerformanceModuleSnapshot[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return module.getSnapshot();\n } catch {\n return null;\n }\n })\n .filter((snapshot): snapshot is PerformanceModuleSnapshot => snapshot !== null);\n\n const createContext = (\n cause: \"degrade\" | \"recover\",\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n ): PerformanceAdjustmentContext => ({\n cycle,\n cause,\n pressureLevel,\n metrics,\n target,\n workerGraph,\n });\n\n const classifyCurrentPressure = (metrics: GovernorMetrics) =>\n classifyPressure(\n metrics,\n target.downgradeFrameTimeMs,\n target.upgradeFrameTimeMs,\n adaptation.trendSensitivityMs\n );\n\n const buildDecision = (\n processed: boolean,\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n adjustments: readonly PerformanceAdjustmentRecord[],\n errors: readonly GovernorErrorRecord[],\n reason: string\n ): GovernorDecision => ({\n cycle,\n processed,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n errors,\n reason,\n });\n\n const buildIgnoredDecision = (\n reason: string,\n errors: readonly GovernorErrorRecord[] = []\n ): GovernorDecision => {\n const metrics =\n lastDecision?.metrics ??\n createMetrics(samples, emaFrameTimeMs, target.targetFrameTimeMs, lastThermalState);\n const pressureLevel = lastDecision?.pressureLevel ?? classifyCurrentPressure(metrics);\n const workerGraph =\n lastDecision?.workerGraph ?? buildWorkerGraphSummary(getModuleSnapshots());\n\n return buildDecision(\n false,\n pressureLevel,\n metrics,\n workerGraph,\n [],\n errors,\n reason\n );\n };\n\n const rememberFrameId = (frameId: string): boolean => {\n if (recentFrameIds.has(frameId)) {\n return false;\n }\n\n recentFrameIds.add(frameId);\n recentFrameIdQueue.push(frameId);\n\n while (recentFrameIdQueue.length > adaptation.maxRetainedFrameIds) {\n const oldest = recentFrameIdQueue.shift();\n if (oldest) {\n recentFrameIds.delete(oldest);\n }\n }\n\n return true;\n };\n\n const selectDegradeCandidates = (\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceModuleAdapter[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return {\n module,\n snapshot: module.getSnapshot(),\n };\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_SNAPSHOT_FAILED\",\n message: `Module \"${module.id}\" snapshot failed and the module was skipped.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n return null;\n }\n })\n .filter(\n (\n candidate\n ): candidate is {\n module: PerformanceModuleAdapter;\n snapshot: PerformanceModuleSnapshot;\n } => candidate !== null\n )\n .sort((left, right) => {\n const leftRank = rankForDegrade(\n left.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n const rightRank = rankForDegrade(\n right.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n\n return leftRank - rightRank;\n })\n .map((candidate) => candidate.module);\n\n const attemptDowngrade = (\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const changesAllowed =\n pressureLevel === \"starved\"\n ? adaptation.maxStepChangesPerCycle\n : Math.min(\n adaptation.maxStepChangesPerCycle,\n pressureLevel === \"critical\" ? 2 : 1\n );\n const context = createContext(\"degrade\", pressureLevel, metrics, workerGraph);\n const adjustments: PerformanceAdjustmentRecord[] = [];\n\n for (const module of selectDegradeCandidates(decisionErrors, correlationId)) {\n if (adjustments.length >= changesAllowed) {\n break;\n }\n\n try {\n const adjustment = module.stepDown(context);\n if (!adjustment) {\n continue;\n }\n\n adjustments.push(adjustment);\n recoveryStack.push(module.id);\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_DOWN_FAILED\",\n message: `Module \"${module.id}\" could not be reduced during degrade handling.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return adjustments;\n };\n\n const attemptRecovery = (\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const context = createContext(\"recover\", \"recovering\", metrics, workerGraph);\n\n while (recoveryStack.length > 0) {\n const moduleId = recoveryStack[recoveryStack.length - 1];\n if (!moduleId) {\n recoveryStack.pop();\n continue;\n }\n\n const module = modules.get(moduleId);\n if (!module) {\n recoveryStack.pop();\n continue;\n }\n\n try {\n const adjustment = module.stepUp(context);\n recoveryStack.pop();\n\n if (adjustment) {\n return [adjustment];\n }\n } catch {\n recoveryStack.pop();\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_UP_FAILED\",\n message: `Module \"${moduleId}\" could not be restored during recovery handling.`,\n retryable: true,\n moduleId,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return [];\n };\n\n return {\n recordFrame(sample) {\n if (!sample || typeof sample !== \"object\") {\n throw new Error(\"recordFrame requires a frame sample object.\");\n }\n\n validateFrameSample(sample);\n\n if (sample.signal?.aborted) {\n return buildIgnoredDecision(\n \"Ignored frame sample because its AbortSignal was already aborted.\"\n );\n }\n\n if (sample.frameId && !rememberFrameId(sample.frameId)) {\n return buildIgnoredDecision(\n `Ignored duplicate frame sample \"${sample.frameId}\".`\n );\n }\n\n cycle += 1;\n const decisionErrors: GovernorErrorRecord[] = [];\n lastThermalState = sample.thermalState ?? lastThermalState;\n emaFrameTimeMs =\n cycle === 1\n ? sample.frameTimeMs\n : sample.frameTimeMs * adaptation.emaAlpha +\n emaFrameTimeMs * (1 - adaptation.emaAlpha);\n\n samples = [...samples, sample].slice(-adaptation.sampleWindowSize);\n\n const metrics = createMetrics(\n samples,\n emaFrameTimeMs,\n target.targetFrameTimeMs,\n lastThermalState\n );\n const workerGraph = buildWorkerGraphSummary(getModuleSnapshots());\n const pressureLevel = classifyCurrentPressure(metrics);\n\n if (pressureLevel === \"recovering\" || pressureLevel === \"stable\") {\n stableRecoveryFrames += 1;\n } else {\n stableRecoveryFrames = 0;\n }\n\n let adjustments: PerformanceAdjustmentRecord[] = [];\n const enoughSamples =\n metrics.sampleCount >= adaptation.minimumSamplesBeforeAdjustment;\n\n if (\n enoughSamples &&\n (pressureLevel === \"elevated\" ||\n pressureLevel === \"critical\" ||\n pressureLevel === \"starved\") &&\n (pressureLevel === \"starved\" ||\n cycle - lastDownCycle >= adaptation.degradeCooldownFrames)\n ) {\n adjustments = attemptDowngrade(\n pressureLevel,\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastDownCycle = cycle;\n stableRecoveryFrames = 0;\n }\n } else if (\n enoughSamples &&\n pressureLevel === \"recovering\" &&\n stableRecoveryFrames >= adaptation.minStableFramesForRecovery &&\n cycle - lastUpCycle >= adaptation.upgradeCooldownFrames\n ) {\n adjustments = attemptRecovery(\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastUpCycle = cycle;\n stableRecoveryFrames = 0;\n }\n }\n\n const decision = buildDecision(\n true,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n decisionErrors,\n buildReason(pressureLevel, metrics, workerGraph)\n );\n\n emitTelemetry(\n options.telemetry?.onDecision,\n decision,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_DECISION_HOOK_FAILED\",\n message: \"Decision telemetry callback failed.\",\n retryable: true,\n correlationId: sample.frameId,\n }),\n decisionErrors\n );\n\n const finalizedDecision =\n decisionErrors.length === 0\n ? decision\n : {\n ...decision,\n errors: [...decisionErrors],\n };\n\n lastDecision = finalizedDecision;\n return finalizedDecision;\n },\n registerModule(module) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Module \"${module.id}\" is already registered.`);\n }\n\n modules.set(module.id, module);\n\n return () => {\n modules.delete(module.id);\n recoveryStack = recoveryStack.filter((id) => id !== module.id);\n };\n },\n getTarget() {\n return target;\n },\n getState(): GovernorState {\n const moduleSnapshots = getModuleSnapshots();\n return {\n cycle,\n target,\n device,\n metrics: lastDecision?.metrics ?? null,\n modules: moduleSnapshots,\n workerGraph: buildWorkerGraphSummary(moduleSnapshots),\n lastDecision,\n recentErrors,\n };\n },\n reset() {\n cycle = 0;\n samples = [];\n emaFrameTimeMs = target.targetFrameTimeMs;\n lastThermalState = device.thermalState;\n lastDecision = null;\n stableRecoveryFrames = 0;\n lastDownCycle = Number.NEGATIVE_INFINITY;\n lastUpCycle = Number.NEGATIVE_INFINITY;\n recoveryStack = [];\n recentErrors = [];\n recentFrameIds = new Set();\n recentFrameIdQueue = [];\n },\n };\n}\n\n/**\n * Alias for createGpuPerformanceGovernor.\n */\nexport const createPerformanceGovernor = createGpuPerformanceGovernor;\n","import type {\n ModuleImportance,\n ModuleQualityLevel,\n ModuleAuthority,\n PerformanceBudgetMetadata,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceModuleSnapshot,\n QualityLadderAdapter,\n QualityLadderAdapterOptions,\n} from \"./types.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n moduleAuthorities,\n moduleImportances,\n performanceDomains,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nfunction resolveLevelIndex<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[],\n initialLevel: number | string | undefined\n): number {\n if (typeof initialLevel === \"number\") {\n if (initialLevel < 0 || initialLevel >= levels.length) {\n throw new Error(`Initial level index ${initialLevel} is out of range.`);\n }\n\n return initialLevel;\n }\n\n if (typeof initialLevel === \"string\") {\n const index = levels.findIndex((level) => level.id === initialLevel);\n if (index < 0) {\n throw new Error(`Initial level \"${initialLevel}\" does not exist in the ladder.`);\n }\n\n return index;\n }\n\n return levels.length - 1;\n}\n\nfunction assertUniqueLevelIds<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[]\n): void {\n const seen = new Set<string>();\n\n for (const level of levels) {\n assertIdentifier(\"levels[].id\", level.id);\n\n if (readNonNegativeNumber(`estimatedCostMs for level \"${level.id}\"`, level.estimatedCostMs) === undefined) {\n // no-op\n }\n\n if (seen.has(level.id)) {\n throw new Error(`Duplicate ladder level id \"${level.id}\" detected.`);\n }\n\n seen.add(level.id);\n }\n}\n\nfunction buildSnapshot<Payload>(\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n metadata: PerformanceBudgetMetadata,\n levels: readonly ModuleQualityLevel<Payload>[],\n currentLevelIndex: number\n): PerformanceModuleSnapshot<Payload> {\n const currentLevel = levels[currentLevelIndex]!;\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n currentLevelIndex,\n currentLevel,\n levelCount: levels.length,\n isAtMinimum: currentLevelIndex === 0,\n isAtMaximum: currentLevelIndex === levels.length - 1,\n estimatedCostMs: currentLevel.estimatedCostMs,\n };\n}\n\nfunction buildAdjustment<Payload>(\n direction: \"down\" | \"up\",\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n previousLevelIndex: number,\n nextLevelIndex: number,\n levels: readonly ModuleQualityLevel<Payload>[],\n context: PerformanceAdjustmentContext\n): PerformanceAdjustmentRecord<Payload> {\n const previousLevel = levels[previousLevelIndex]!;\n const nextLevel = levels[nextLevelIndex]!;\n\n return {\n moduleId: id,\n domain,\n authority,\n importance,\n direction,\n fromLevelIndex: previousLevelIndex,\n toLevelIndex: nextLevelIndex,\n fromLevelId: previousLevel.id,\n toLevelId: nextLevel.id,\n appliedConfig: nextLevel.config,\n reason:\n direction === \"down\"\n ? `Reduced ${id} while ${context.pressureLevel} pressure exceeded the negotiated frame budget.`\n : `Restored ${id} after sustained recovery under the negotiated frame budget.`,\n };\n}\n\n/**\n * Creates a ladder-backed module adapter ordered from lowest quality to highest quality.\n */\nexport function createQualityLadderAdapter<Payload>(\n options: QualityLadderAdapterOptions<Payload>\n): QualityLadderAdapter<Payload> {\n const id = assertIdentifier(\"adapter id\", options.id);\n\n if (!Array.isArray(options.levels) || options.levels.length === 0) {\n throw new Error(`Quality ladder adapter \"${id}\" requires at least one level.`);\n }\n\n if (options.levels.length > 64) {\n throw new Error(`Quality ladder adapter \"${id}\" cannot exceed 64 quality levels.`);\n }\n\n assertUniqueLevelIds(options.levels);\n\n const authority =\n options.authority === undefined\n ? \"visual\"\n : assertEnumValue(\"authority\", options.authority, moduleAuthorities);\n const importance =\n options.importance === undefined\n ? \"medium\"\n : assertEnumValue(\"importance\", options.importance, moduleImportances);\n const domain = assertEnumValue(\"domain\", options.domain, performanceDomains);\n const levels = [...options.levels];\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n let currentLevelIndex = resolveLevelIndex(levels, options.initialLevel);\n\n const emitChange = (\n context: PerformanceAdjustmentContext,\n adjustment: PerformanceAdjustmentRecord<Payload>,\n previousLevelIndex: number\n ) => {\n if (typeof options.onLevelChange !== \"function\") {\n return;\n }\n\n try {\n options.onLevelChange({\n context,\n previousLevel: levels[previousLevelIndex]!,\n currentLevel: levels[currentLevelIndex]!,\n adjustment,\n });\n } catch {\n // Change notifications must not destabilize the governor.\n }\n };\n\n const apply = (\n direction: \"down\" | \"up\",\n context: PerformanceAdjustmentContext\n ): PerformanceAdjustmentRecord<Payload> | null => {\n const nextLevelIndex =\n direction === \"down\" ? currentLevelIndex - 1 : currentLevelIndex + 1;\n\n if (nextLevelIndex < 0 || nextLevelIndex >= levels.length) {\n return null;\n }\n\n const previousLevelIndex = currentLevelIndex;\n currentLevelIndex = nextLevelIndex;\n\n const adjustment = buildAdjustment<Payload>(\n direction,\n id,\n domain,\n authority,\n importance,\n previousLevelIndex,\n nextLevelIndex,\n levels,\n context\n );\n\n emitChange(context, adjustment, previousLevelIndex);\n return adjustment;\n };\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n getCurrentLevel() {\n return levels[currentLevelIndex]!;\n },\n getSnapshot() {\n return buildSnapshot(\n id,\n domain,\n authority,\n importance,\n metadata,\n levels,\n currentLevelIndex\n );\n },\n stepDown(context) {\n return apply(\"down\", context);\n },\n stepUp(context) {\n return apply(\"up\", context);\n },\n };\n}\n","import { createQualityLadderAdapter } from \"./ladder.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport type {\n ModuleQualityLevel,\n WorkerJobBudgetAdapter,\n WorkerJobBudgetManifest,\n WorkerJobBudgetManifestGraph,\n WorkerJobBudgetManifestGraphJob,\n WorkerJobBudgetManifestPriorityLane,\n WorkerJobBudgetManifestAdapterOptions,\n WorkerJobBudgetManifestJob,\n WorkerJobBudgetAdapterOptions,\n WorkerJobBudgetConfig,\n WorkerJobBudgetSnapshot,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n normalizePlainObject,\n readNonNegativeNumber,\n readPositiveNumber,\n workerJobQueueClasses,\n workerSchedulerModes,\n} from \"./validation.js\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readPositiveInteger(name: string, value: unknown): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nfunction readNonNegativeInteger(name: string, value: unknown): number | undefined {\n const parsed = readNonNegativeNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return parsed;\n}\n\nfunction normalizeDependencies(\n name: string,\n value: unknown\n): readonly string[] {\n if (value === undefined) {\n return Object.freeze([]);\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of dependency ids.`);\n }\n\n return Object.freeze(\n [...new Set(value.map((entry, index) => assertIdentifier(`${name}[${index}]`, entry)))]\n );\n}\n\nfunction normalizeBudgetLevel(\n level: ModuleQualityLevel<WorkerJobBudgetConfig>,\n index: number\n): ModuleQualityLevel<WorkerJobBudgetConfig> {\n if (!isPlainObject(level.config)) {\n throw new Error(`Worker job budget level ${index} must provide an object config.`);\n }\n\n const levelId = assertIdentifier(`levels[${index}].id`, level.id);\n const maxDispatchesPerFrame = readPositiveInteger(\n `levels[${index}].config.maxDispatchesPerFrame`,\n level.config.maxDispatchesPerFrame\n );\n const maxJobsPerDispatch = readPositiveInteger(\n `levels[${index}].config.maxJobsPerDispatch`,\n level.config.maxJobsPerDispatch\n );\n const cadenceDivisor = readPositiveInteger(\n `levels[${index}].config.cadenceDivisor`,\n level.config.cadenceDivisor\n );\n const workgroupScale = readPositiveNumber(\n `levels[${index}].config.workgroupScale`,\n level.config.workgroupScale\n );\n const maxQueueDepth = readNonNegativeInteger(\n `levels[${index}].config.maxQueueDepth`,\n level.config.maxQueueDepth\n );\n\n if (workgroupScale !== undefined && workgroupScale > 1) {\n throw new Error(\n `levels[${index}].config.workgroupScale must be less than or equal to 1.`\n );\n }\n\n return {\n ...level,\n id: levelId,\n config: {\n maxDispatchesPerFrame: maxDispatchesPerFrame ?? 1,\n maxJobsPerDispatch: maxJobsPerDispatch ?? 1,\n cadenceDivisor,\n workgroupScale,\n maxQueueDepth,\n metadata: normalizePlainObject(\n `levels[${index}].config.metadata`,\n level.config.metadata\n ),\n },\n };\n}\n\nfunction normalizeManifestJobs(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): readonly WorkerJobBudgetManifestJob[] {\n if (Array.isArray(manifest)) {\n return manifest;\n }\n\n if (!isPlainObject(manifest) || !Array.isArray(manifest.jobs)) {\n throw new Error(\n \"Worker job manifests must provide a jobs array or be an array of jobs.\"\n );\n }\n\n return manifest.jobs;\n}\n\nfunction buildPriorityLanes(\n jobs: readonly WorkerJobBudgetManifestGraphJob[]\n): readonly WorkerJobBudgetManifestPriorityLane[] {\n const lanes = new Map<number, {\n priority: number;\n jobIds: string[];\n rootJobIds: string[];\n }>();\n\n for (const job of jobs) {\n const lane = lanes.get(job.priority) ?? {\n priority: job.priority,\n jobIds: [],\n rootJobIds: [],\n };\n lane.jobIds.push(job.id);\n if (job.root) {\n lane.rootJobIds.push(job.id);\n }\n lanes.set(job.priority, lane);\n }\n\n return Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobIds: Object.freeze([...lane.jobIds]),\n rootJobIds: Object.freeze([...lane.rootJobIds]),\n jobCount: lane.jobIds.length,\n rootCount: lane.rootJobIds.length,\n })\n )\n );\n}\n\nfunction resolveManifestJobType(job: WorkerJobBudgetManifestJob, index: number): string {\n const jobType = job.performance?.jobType ?? job.worker?.jobType;\n if (typeof jobType !== \"string\") {\n throw new Error(\n `Manifest job ${index} must provide performance.jobType or worker.jobType.`\n );\n }\n\n return assertIdentifier(`jobs[${index}].jobType`, jobType);\n}\n\nfunction resolveManifestQueueClass(\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"queueClass\"] {\n const queueClass = job.performance?.queueClass ?? job.worker?.queueClass;\n if (queueClass === undefined) {\n throw new Error(\n `Manifest job ${index} must provide performance.queueClass or worker.queueClass.`\n );\n }\n\n return assertEnumValue(`jobs[${index}].queueClass`, queueClass, workerJobQueueClasses);\n}\n\nfunction resolveManifestSchedulerMode(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"schedulerMode\"] {\n const topLevelMode =\n !Array.isArray(manifest) && isPlainObject(manifest)\n ? manifest.schedulerMode\n : undefined;\n const schedulerMode = job.worker?.schedulerMode ?? topLevelMode;\n\n if (schedulerMode === undefined) {\n return \"flat\";\n }\n\n return assertEnumValue(\n `jobs[${index}].schedulerMode`,\n schedulerMode,\n workerSchedulerModes\n );\n}\n\nfunction resolveManifestDependencies(\n job: WorkerJobBudgetManifestJob,\n index: number\n): readonly string[] {\n return normalizeDependencies(\n `jobs[${index}].dependencies`,\n job.worker?.dependencies\n );\n}\n\nfunction resolveManifestPriority(\n job: WorkerJobBudgetManifestJob,\n index: number\n): number {\n return readNonNegativeInteger(\n `jobs[${index}].priority`,\n job.worker?.priority\n ) ?? 0;\n}\n\nfunction buildManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n const jobs = normalizeManifestJobs(manifest);\n const normalized = jobs.map((job, index) => {\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const metadata = normalizePerformanceBudgetMetadata(\n `jobs[${index}].performance`,\n job.performance\n );\n\n return {\n id,\n key: typeof job.key === \"string\" ? job.key : undefined,\n label: typeof job.label === \"string\" ? job.label : undefined,\n jobType: resolveManifestJobType(job, index),\n queueClass: resolveManifestQueueClass(job, index),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority: resolveManifestPriority(job, index),\n dependencies: resolveManifestDependencies(job, index),\n schedulerMode: resolveManifestSchedulerMode(manifest, job, index),\n };\n });\n\n const ids = new Set<string>();\n for (const job of normalized) {\n if (ids.has(job.id)) {\n throw new Error(`Duplicate worker manifest job id detected: ${job.id}`);\n }\n ids.add(job.id);\n }\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n if (!ids.has(dependency)) {\n throw new Error(\n `Worker manifest job \"${job.id}\" depends on unknown job \"${dependency}\".`\n );\n }\n if (dependency === job.id) {\n throw new Error(`Worker manifest job \"${job.id}\" cannot depend on itself.`);\n }\n }\n }\n\n const dependentsById = new Map(normalized.map((job) => [job.id, [] as string[]]));\n const indegree = new Map(\n normalized.map((job) => [job.id, job.dependencies.length] as const)\n );\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n dependentsById.get(dependency)?.push(job.id);\n }\n }\n\n const roots = normalized\n .filter((job) => job.dependencies.length === 0)\n .map((job) => job.id);\n const queue = [...roots];\n const topologicalOrder: string[] = [];\n\n while (queue.length > 0) {\n const currentId = queue.shift();\n if (!currentId) {\n continue;\n }\n topologicalOrder.push(currentId);\n for (const dependentId of dependentsById.get(currentId) ?? []) {\n const next = (indegree.get(dependentId) ?? 0) - 1;\n indegree.set(dependentId, next);\n if (next === 0) {\n queue.push(dependentId);\n }\n }\n }\n\n if (topologicalOrder.length !== normalized.length) {\n throw new Error(\"Worker manifest graph contains a cycle.\");\n }\n\n const graphJobs = normalized.map((job) =>\n Object.freeze({\n ...job,\n dependencies: Object.freeze([...job.dependencies]),\n dependents: Object.freeze([...(dependentsById.get(job.id) ?? [])]),\n dependencyCount: job.dependencies.length,\n unresolvedDependencyCount: job.dependencies.length,\n dependentCount: (dependentsById.get(job.id) ?? []).length,\n root: job.dependencies.length === 0,\n })\n );\n\n return Object.freeze({\n schedulerMode: graphJobs.some(\n (job) => job.schedulerMode === \"dag\" || job.dependencies.length > 0\n )\n ? \"dag\"\n : \"flat\",\n jobCount: graphJobs.length,\n maxPriority: graphJobs.reduce(\n (current, job) => Math.max(current, job.priority),\n 0\n ),\n representationBands: Object.freeze(\n [\n ...new Set(\n graphJobs\n .map((job) => job.representationBand)\n .filter((band): band is NonNullable<typeof band> => typeof band === \"string\")\n ),\n ]\n ),\n jobIds: Object.freeze(graphJobs.map((job) => job.id)),\n roots: Object.freeze(graphJobs.filter((job) => job.root).map((job) => job.id)),\n topologicalOrder: Object.freeze(topologicalOrder),\n priorityLanes: buildPriorityLanes(graphJobs),\n jobs: Object.freeze(graphJobs),\n });\n}\n\n/**\n * Creates a ladder-backed adapter specialized for gpu-worker job budgets.\n */\nexport function createWorkerJobBudgetAdapter(\n options: WorkerJobBudgetAdapterOptions\n): WorkerJobBudgetAdapter {\n const jobType = assertIdentifier(\"jobType\", options.jobType);\n const queueClass =\n options.queueClass === undefined\n ? \"custom\"\n : assertEnumValue(\"queueClass\", options.queueClass, workerJobQueueClasses);\n const priority = readNonNegativeInteger(\"priority\", options.priority) ?? 0;\n const dependencies = normalizeDependencies(\"dependencies\", options.dependencies);\n const dependents = normalizeDependencies(\"dependents\", options.dependents);\n const schedulerMode =\n options.schedulerMode === undefined\n ? \"flat\"\n : assertEnumValue(\"schedulerMode\", options.schedulerMode, workerSchedulerModes);\n const dependencyCount = dependencies.length;\n const unresolvedDependencyCount = dependencyCount;\n const dependentCount = dependents.length;\n const root = dependencyCount === 0;\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n\n const levels = options.levels.map(normalizeBudgetLevel);\n\n const ladder = createQualityLadderAdapter<WorkerJobBudgetConfig>({\n id: options.id,\n domain: options.domain ?? \"custom\",\n authority: options.authority,\n importance: options.importance,\n levels,\n initialLevel: options.initialLevel,\n onLevelChange: options.onLevelChange,\n });\n\n const getWorkerSnapshot = (): WorkerJobBudgetSnapshot => ({\n ...ladder.getSnapshot(),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n jobType,\n queueClass,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n });\n\n return {\n ...ladder,\n jobType,\n queueClass,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n getSnapshot() {\n return getWorkerSnapshot();\n },\n getBudget() {\n return ladder.getCurrentLevel().config;\n },\n getWorkerSnapshot,\n };\n}\n\n/**\n * Normalizes a worker manifest into a graph with roots, dependents, and\n * priority lanes so runtimes can reason about multi-root DAG workloads.\n */\nexport function createWorkerJobBudgetManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n return buildManifestGraph(manifest);\n}\n\n/**\n * Creates worker budget adapters from a consumer worker-manifest shape.\n */\nexport function createWorkerJobBudgetAdaptersFromManifest(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n options: WorkerJobBudgetManifestAdapterOptions = {}\n): readonly WorkerJobBudgetAdapter[] {\n const graph = buildManifestGraph(manifest);\n const graphJobById = new Map(graph.jobs.map((job) => [job.id, job]));\n const jobs = normalizeManifestJobs(manifest);\n const { initialLevels, selectJob, onLevelChange } = options;\n\n return jobs.flatMap((job, index) => {\n if (selectJob && !selectJob(job, index)) {\n return [];\n }\n\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const graphJob = graphJobById.get(id);\n if (!graphJob) {\n throw new Error(`Worker manifest graph is missing job \"${id}\".`);\n }\n\n return [\n createWorkerJobBudgetAdapter({\n id,\n jobType: graphJob.jobType,\n queueClass: graphJob.queueClass,\n priority: graphJob.priority,\n dependencies: graphJob.dependencies,\n dependents: graphJob.dependents,\n schedulerMode: graphJob.schedulerMode,\n domain: job.performance.domain,\n authority: job.performance.authority,\n importance: job.performance.importance,\n representationBand: job.performance.representationBand,\n qualityDimensions: job.performance.qualityDimensions,\n importanceSignals: job.performance.importanceSignals,\n levels: job.performance.levels,\n initialLevel: initialLevels?.[id],\n onLevelChange:\n onLevelChange === undefined\n ? undefined\n : (event) => {\n onLevelChange(job, event);\n },\n }),\n ];\n });\n}\n","import type {\n GpuDebugAdapterInfo,\n GpuPipelinePhase,\n GpuDebugQueueClass,\n GpuResourceCategory,\n GpuVector3,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const gpuDebugQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"transfer\",\n \"custom\",\n]) satisfies readonly GpuDebugQueueClass[];\n\nexport const gpuResourceCategories = Object.freeze([\n \"buffer\",\n \"texture\",\n \"bind-group\",\n \"pipeline\",\n \"custom\",\n]) satisfies readonly GpuResourceCategory[];\n\nexport const gpuPipelinePhases = Object.freeze([\n \"simulation\",\n \"secondary-simulation\",\n \"scene-preparation\",\n \"render\",\n]) satisfies readonly GpuPipelinePhase[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(`${name} must be one of: ${allowedValues.join(\", \")}.`);\n }\n\n return value as T;\n}\n\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\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\n return value;\n}\n\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function readPositiveInteger(\n name: string,\n value: unknown\n): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\nexport function normalizeVector(\n name: string,\n value: GpuVector3\n): Required<GpuVector3> {\n const x = readPositiveInteger(`${name}.x`, value.x) ?? 1;\n const y = readPositiveInteger(`${name}.y`, value.y) ?? 1;\n const z = readPositiveInteger(`${name}.z`, value.z) ?? 1;\n return { x, y, z };\n}\n\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n\nexport function normalizeAdapterInfo(\n value: GpuDebugAdapterInfo | undefined\n): Readonly<GpuDebugAdapterInfo> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n const adapter: GpuDebugAdapterInfo = {};\n\n if (value.label !== undefined) {\n adapter.label = String(value.label).trim().slice(0, 120);\n }\n if (value.vendor !== undefined) {\n adapter.vendor = String(value.vendor).trim().slice(0, 120);\n }\n if (value.architecture !== undefined) {\n adapter.architecture = String(value.architecture).trim().slice(0, 120);\n }\n if (value.driver !== undefined) {\n adapter.driver = String(value.driver).trim().slice(0, 120);\n }\n\n adapter.maxBufferSizeBytes = readPositiveInteger(\n \"adapter.maxBufferSizeBytes\",\n value.maxBufferSizeBytes\n );\n adapter.maxStorageBufferBindingSizeBytes = readPositiveInteger(\n \"adapter.maxStorageBufferBindingSizeBytes\",\n value.maxStorageBufferBindingSizeBytes\n );\n adapter.maxComputeInvocationsPerWorkgroup = readPositiveInteger(\n \"adapter.maxComputeInvocationsPerWorkgroup\",\n value.maxComputeInvocationsPerWorkgroup\n );\n adapter.maxComputeWorkgroupsPerDimension = readPositiveInteger(\n \"adapter.maxComputeWorkgroupsPerDimension\",\n value.maxComputeWorkgroupsPerDimension\n );\n adapter.memoryCapacityHintBytes = readPositiveInteger(\n \"adapter.memoryCapacityHintBytes\",\n value.memoryCapacityHintBytes\n );\n adapter.coreCountHint = readPositiveInteger(\n \"adapter.coreCountHint\",\n value.coreCountHint\n );\n adapter.metadata = normalizePlainObject(\"adapter.metadata\", value.metadata);\n\n return Object.freeze(adapter);\n}\n","import type {\n GpuDebugDagSnapshot,\n GpuDebugDispatchSnapshot,\n GpuDebugPipelineSnapshot,\n GpuDebugQueueSnapshot,\n GpuDebugSession,\n GpuDebugSessionOptions,\n GpuDebugSnapshot,\n GpuDependencyUnlockSample,\n GpuDispatchSample,\n GpuFrameSample,\n GpuPipelinePhaseSample,\n GpuQueueSample,\n GpuReadyLaneSample,\n GpuResourceCategory,\n TrackedGpuAllocation,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n gpuDebugQueueClasses,\n gpuPipelinePhases,\n gpuResourceCategories,\n isAbortSignalLike,\n normalizeAdapterInfo,\n normalizeVector,\n readNonNegativeNumber,\n readPositiveInteger,\n readPositiveNumber,\n} from \"./validation.js\";\n\nconst DEFAULT_OPTIONS = Object.freeze({\n enabled: false,\n maxRetainedDispatches: 240,\n maxRetainedQueueSamples: 240,\n maxRetainedReadyLaneSamples: 240,\n maxRetainedDependencyUnlockSamples: 240,\n maxRetainedPipelinePhaseSamples: 240,\n maxRetainedFrameSamples: 240,\n maxTrackedAllocations: 512,\n});\n\nconst LIMITATIONS = Object.freeze([\n \"Tracked memory reflects only allocations reported to this debug session.\",\n \"Portable WebGPU does not expose authoritative live GPU core-count or total-memory counters.\",\n \"Hardware hints are optional caller-supplied metadata and may be platform-specific.\",\n \"Ready-lane and dependency-unlock diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n \"Pipeline phase and snapshot-lag diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n]);\n\ninterface NormalizedAllocation extends Omit<TrackedGpuAllocation, \"signal\"> {\n label?: string;\n}\n\ntype NormalizedQueueSample = Omit<GpuQueueSample, \"signal\">;\n\ninterface NormalizedReadyLaneSample extends Omit<GpuReadyLaneSample, \"signal\"> {\n priority?: number;\n}\n\ninterface NormalizedDispatchSample extends Omit<GpuDispatchSample, \"signal\"> {\n workgroups: { x: number; y: number; z: number };\n workgroupSize: { x: number; y: number; z: number };\n}\n\ntype NormalizedFrameSample = Omit<GpuFrameSample, \"signal\">;\n\ninterface NormalizedDependencyUnlockSample\n extends Omit<GpuDependencyUnlockSample, \"signal\"> {\n priority?: number;\n unlockCount: number;\n}\n\ninterface NormalizedPipelinePhaseSample\n extends Omit<GpuPipelinePhaseSample, \"signal\"> {\n durationMs?: number;\n snapshotAgeFrames?: number;\n snapshotAgeMs?: number;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n return Math.min(Math.round(value), 4096);\n}\n\nfunction trimHistory<T>(items: T[], maxEntries: number): void {\n while (items.length > maxEntries) {\n items.shift();\n }\n}\n\nfunction average(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction pushAggregate<T extends string | number>(\n map: Map<T, number>,\n key: T,\n value: number\n): void {\n map.set(key, (map.get(key) ?? 0) + value);\n}\n\nfunction normalizeAllocation(allocation: TrackedGpuAllocation): NormalizedAllocation {\n if (allocation.signal !== undefined && !isAbortSignalLike(allocation.signal)) {\n throw new Error(\"allocation.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id: assertIdentifier(\"allocation.id\", allocation.id),\n owner: assertIdentifier(\"allocation.owner\", allocation.owner),\n category: assertEnumValue(\n \"allocation.category\",\n allocation.category,\n gpuResourceCategories\n ),\n sizeBytes: readPositiveInteger(\"allocation.sizeBytes\", allocation.sizeBytes) ?? 1,\n label:\n allocation.label === undefined\n ? undefined\n : String(allocation.label).trim().slice(0, 120),\n };\n}\n\nfunction normalizeQueueSample(sample: GpuQueueSample): NormalizedQueueSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"queue.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"queue.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"queue.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"queue.depth cannot exceed queue.capacity.\");\n }\n\n return {\n owner: assertIdentifier(\"queue.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"queue.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"queue.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeReadyLaneSample(\n sample: GpuReadyLaneSample\n): NormalizedReadyLaneSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"readyLane.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"readyLane.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"readyLane.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"readyLane.depth cannot exceed readyLane.capacity.\");\n }\n\n const priority = readNonNegativeNumber(\"readyLane.priority\", sample.priority);\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\"readyLane.priority must be an integer greater than or equal to zero.\");\n }\n\n return {\n owner: assertIdentifier(\"readyLane.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"readyLane.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n laneId: assertIdentifier(\"readyLane.laneId\", sample.laneId),\n priority,\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"readyLane.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeDispatchSample(\n sample: GpuDispatchSample\n): NormalizedDispatchSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dispatch.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id:\n sample.id === undefined ? undefined : assertIdentifier(\"dispatch.id\", sample.id),\n owner: assertIdentifier(\"dispatch.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dispatch.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n jobType: assertIdentifier(\"dispatch.jobType\", sample.jobType),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dispatch.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\"dispatch.durationMs\", sample.durationMs),\n workgroups: normalizeVector(\"dispatch.workgroups\", sample.workgroups),\n workgroupSize: normalizeVector(\n \"dispatch.workgroupSize\",\n sample.workgroupSize ?? { x: 1, y: 1, z: 1 }\n ),\n bytesRead: readNonNegativeNumber(\"dispatch.bytesRead\", sample.bytesRead),\n bytesWritten: readNonNegativeNumber(\"dispatch.bytesWritten\", sample.bytesWritten),\n };\n}\n\nfunction normalizeFrameSample(sample: GpuFrameSample): NormalizedFrameSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"frame.signal must be an AbortSignal when provided.\");\n }\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"frame.dropped must be a boolean when provided.\");\n }\n\n return {\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"frame.frameId\", sample.frameId),\n frameTimeMs: readPositiveNumber(\"frame.frameTimeMs\", sample.frameTimeMs) ?? 0,\n targetFrameTimeMs: readPositiveNumber(\n \"frame.targetFrameTimeMs\",\n sample.targetFrameTimeMs\n ),\n gpuBusyMs: readNonNegativeNumber(\"frame.gpuBusyMs\", sample.gpuBusyMs),\n dropped: sample.dropped,\n };\n}\n\nfunction normalizeDependencyUnlockSample(\n sample: GpuDependencyUnlockSample\n): NormalizedDependencyUnlockSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dependencyUnlock.signal must be an AbortSignal when provided.\");\n }\n\n const priority = readNonNegativeNumber(\n \"dependencyUnlock.priority\",\n sample.priority\n );\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\n \"dependencyUnlock.priority must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"dependencyUnlock.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dependencyUnlock.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n sourceJobType: assertIdentifier(\n \"dependencyUnlock.sourceJobType\",\n sample.sourceJobType\n ),\n unlockedJobType: assertIdentifier(\n \"dependencyUnlock.unlockedJobType\",\n sample.unlockedJobType\n ),\n priority,\n unlockCount:\n readPositiveInteger(\"dependencyUnlock.unlockCount\", sample.unlockCount) ?? 1,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dependencyUnlock.frameId\", sample.frameId),\n };\n}\n\nfunction normalizePipelinePhaseSample(\n sample: GpuPipelinePhaseSample\n): NormalizedPipelinePhaseSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"pipelinePhase.signal must be an AbortSignal when provided.\");\n }\n\n const snapshotAgeFrames = readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeFrames\",\n sample.snapshotAgeFrames\n );\n if (snapshotAgeFrames !== undefined && !Number.isInteger(snapshotAgeFrames)) {\n throw new Error(\n \"pipelinePhase.snapshotAgeFrames must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"pipelinePhase.owner\", sample.owner),\n pipeline: assertEnumValue(\n \"pipelinePhase.pipeline\",\n sample.pipeline,\n gpuPipelinePhases\n ),\n stage: assertIdentifier(\"pipelinePhase.stage\", sample.stage),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\n \"pipelinePhase.durationMs\",\n sample.durationMs\n ),\n snapshotFrameId:\n sample.snapshotFrameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.snapshotFrameId\", sample.snapshotFrameId),\n snapshotAgeFrames,\n snapshotAgeMs: readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeMs\",\n sample.snapshotAgeMs\n ),\n };\n}\n\nexport function estimateDispatchInvocations(sample: GpuDispatchSample): number {\n const normalized = normalizeDispatchSample(sample);\n return (\n normalized.workgroups.x *\n normalized.workgroups.y *\n normalized.workgroups.z *\n normalized.workgroupSize.x *\n normalized.workgroupSize.y *\n normalized.workgroupSize.z\n );\n}\n\nexport function createGpuDebugSession(\n options: GpuDebugSessionOptions = {}\n): GpuDebugSession {\n const settings = {\n enabled: options.enabled ?? DEFAULT_OPTIONS.enabled,\n maxRetainedDispatches: clampCount(\n options.maxRetainedDispatches,\n DEFAULT_OPTIONS.maxRetainedDispatches\n ),\n maxRetainedQueueSamples: clampCount(\n options.maxRetainedQueueSamples,\n DEFAULT_OPTIONS.maxRetainedQueueSamples\n ),\n maxRetainedReadyLaneSamples: clampCount(\n options.maxRetainedReadyLaneSamples,\n DEFAULT_OPTIONS.maxRetainedReadyLaneSamples\n ),\n maxRetainedDependencyUnlockSamples: clampCount(\n options.maxRetainedDependencyUnlockSamples,\n DEFAULT_OPTIONS.maxRetainedDependencyUnlockSamples\n ),\n maxRetainedPipelinePhaseSamples: clampCount(\n options.maxRetainedPipelinePhaseSamples,\n DEFAULT_OPTIONS.maxRetainedPipelinePhaseSamples\n ),\n maxRetainedFrameSamples: clampCount(\n options.maxRetainedFrameSamples,\n DEFAULT_OPTIONS.maxRetainedFrameSamples\n ),\n maxTrackedAllocations: clampCount(\n options.maxTrackedAllocations,\n DEFAULT_OPTIONS.maxTrackedAllocations\n ),\n };\n\n const adapter = normalizeAdapterInfo(options.adapter);\n let enabled = settings.enabled;\n const allocations = new Map<string, NormalizedAllocation>();\n const allocationOrder: string[] = [];\n const queueSamples: NormalizedQueueSample[] = [];\n const readyLaneSamples: NormalizedReadyLaneSample[] = [];\n const dispatchSamples: NormalizedDispatchSample[] = [];\n const dependencyUnlockSamples: NormalizedDependencyUnlockSample[] = [];\n const pipelinePhaseSamples: NormalizedPipelinePhaseSample[] = [];\n const frameSamples: NormalizedFrameSample[] = [];\n let peakTrackedBytes = 0;\n\n const totalTrackedBytes = (): number =>\n [...allocations.values()].reduce((total, allocation) => total + allocation.sizeBytes, 0);\n\n const updatePeakTrackedBytes = (): void => {\n peakTrackedBytes = Math.max(peakTrackedBytes, totalTrackedBytes());\n };\n\n const ensureAllocationCapacity = (): void => {\n while (allocationOrder.length > settings.maxTrackedAllocations) {\n const oldestId = allocationOrder.shift();\n if (oldestId !== undefined) {\n allocations.delete(oldestId);\n }\n }\n };\n\n const buildDispatchSnapshot = (): GpuDebugDispatchSnapshot => {\n const durations = dispatchSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const bytesRead = dispatchSamples\n .map((sample) => sample.bytesRead)\n .filter((value): value is number => value !== undefined);\n const bytesWritten = dispatchSamples\n .map((sample) => sample.bytesWritten)\n .filter((value): value is number => value !== undefined);\n\n const byQueueClass = new Map<\n NormalizedDispatchSample[\"queueClass\"],\n {\n queueClass: NormalizedDispatchSample[\"queueClass\"];\n dispatches: number;\n totalDurationMs: number;\n estimatedInvocations: number;\n }\n >();\n\n let estimatedWorkgroups = 0;\n let estimatedInvocations = 0;\n\n for (const sample of dispatchSamples) {\n const workgroupCount =\n sample.workgroups.x * sample.workgroups.y * sample.workgroups.z;\n const invocationCount =\n workgroupCount *\n sample.workgroupSize.x *\n sample.workgroupSize.y *\n sample.workgroupSize.z;\n estimatedWorkgroups += workgroupCount;\n estimatedInvocations += invocationCount;\n\n const bucket = byQueueClass.get(sample.queueClass) ?? {\n queueClass: sample.queueClass,\n dispatches: 0,\n totalDurationMs: 0,\n estimatedInvocations: 0,\n };\n bucket.dispatches += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n bucket.estimatedInvocations += invocationCount;\n byQueueClass.set(sample.queueClass, bucket);\n }\n\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const totalFrameTimeMs = frameTimes.reduce((total, value) => total + value, 0);\n const totalDurationMs = durations.reduce((total, value) => total + value, 0);\n\n return {\n sampleCount: dispatchSamples.length,\n totalDurationMs,\n averageDurationMs: average(durations),\n estimatedWorkgroups,\n estimatedInvocations,\n averageBytesRead: average(bytesRead),\n averageBytesWritten: average(bytesWritten),\n busyRatio:\n totalFrameTimeMs > 0 ? Math.min(totalDurationMs / totalFrameTimeMs, 1) : undefined,\n byQueueClass: [...byQueueClass.values()].sort(\n (left, right) => right.totalDurationMs - left.totalDurationMs\n ),\n };\n };\n\n const buildQueueSnapshot = (): GpuDebugQueueSnapshot => {\n const depths = queueSamples.map((sample) => sample.depth);\n const hottestQueues = queueSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakUtilizationRatio = queueSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n return {\n sampleCount: queueSamples.length,\n averageDepth: average(depths) ?? 0,\n peakDepth: depths.length === 0 ? 0 : Math.max(...depths),\n peakUtilizationRatio,\n hottestQueues,\n };\n };\n\n const buildDagSnapshot = (): GpuDebugDagSnapshot => {\n const laneDepths = readyLaneSamples.map((sample) => sample.depth);\n const hottestReadyLanes = readyLaneSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n laneId: sample.laneId,\n priority: sample.priority,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakReadyLaneUtilizationRatio = readyLaneSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n const bySourceJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n sourceJobType: string;\n unlockCount: number;\n }\n >();\n const byUnlockedJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n unlockedJobType: string;\n priority?: number;\n unlockCount: number;\n }\n >();\n\n let totalUnlockCount = 0;\n\n for (const sample of dependencyUnlockSamples) {\n totalUnlockCount += sample.unlockCount;\n\n const sourceKey = `${sample.owner}:${sample.queueClass}:${sample.sourceJobType}`;\n const unlockedKey =\n `${sample.owner}:${sample.queueClass}:` +\n `${sample.unlockedJobType}:${sample.priority ?? \"none\"}`;\n\n const sourceBucket = bySourceJobType.get(sourceKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n sourceJobType: sample.sourceJobType,\n unlockCount: 0,\n };\n sourceBucket.unlockCount += sample.unlockCount;\n bySourceJobType.set(sourceKey, sourceBucket);\n\n const unlockedBucket = byUnlockedJobType.get(unlockedKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n unlockedJobType: sample.unlockedJobType,\n priority: sample.priority,\n unlockCount: 0,\n };\n unlockedBucket.unlockCount += sample.unlockCount;\n byUnlockedJobType.set(unlockedKey, unlockedBucket);\n }\n\n return {\n readyLaneSampleCount: readyLaneSamples.length,\n averageReadyLaneDepth: average(laneDepths) ?? 0,\n peakReadyLaneDepth: laneDepths.length === 0 ? 0 : Math.max(...laneDepths),\n peakReadyLaneUtilizationRatio,\n hottestReadyLanes,\n dependencyUnlockSampleCount: dependencyUnlockSamples.length,\n totalUnlockCount,\n bySourceJobType: [...bySourceJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n byUnlockedJobType: [...byUnlockedJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n };\n };\n\n const buildPipelineSnapshot = (): GpuDebugPipelineSnapshot => {\n const durations = pipelinePhaseSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeMsValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeFrameValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeFrames)\n .filter((value): value is number => value !== undefined);\n\n const byPipeline = new Map<\n NormalizedPipelinePhaseSample[\"pipeline\"],\n {\n pipeline: NormalizedPipelinePhaseSample[\"pipeline\"];\n sampleCount: number;\n totalDurationMs: number;\n durationValues: number[];\n snapshotAgeMsValues: number[];\n snapshotAgeFramesValues: number[];\n }\n >();\n\n for (const sample of pipelinePhaseSamples) {\n const bucket = byPipeline.get(sample.pipeline) ?? {\n pipeline: sample.pipeline,\n sampleCount: 0,\n totalDurationMs: 0,\n durationValues: [],\n snapshotAgeMsValues: [],\n snapshotAgeFramesValues: [],\n };\n bucket.sampleCount += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n if (sample.durationMs !== undefined) {\n bucket.durationValues.push(sample.durationMs);\n }\n if (sample.snapshotAgeMs !== undefined) {\n bucket.snapshotAgeMsValues.push(sample.snapshotAgeMs);\n }\n if (sample.snapshotAgeFrames !== undefined) {\n bucket.snapshotAgeFramesValues.push(sample.snapshotAgeFrames);\n }\n byPipeline.set(sample.pipeline, bucket);\n }\n\n const hottestStages = pipelinePhaseSamples\n .map((sample) => ({\n owner: sample.owner,\n pipeline: sample.pipeline,\n stage: sample.stage,\n frameId: sample.frameId,\n durationMs: sample.durationMs,\n snapshotFrameId: sample.snapshotFrameId,\n snapshotAgeFrames: sample.snapshotAgeFrames,\n snapshotAgeMs: sample.snapshotAgeMs,\n }))\n .sort((left, right) => {\n const leftScore =\n left.durationMs ??\n left.snapshotAgeMs ??\n left.snapshotAgeFrames ??\n 0;\n const rightScore =\n right.durationMs ??\n right.snapshotAgeMs ??\n right.snapshotAgeFrames ??\n 0;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n return {\n sampleCount: pipelinePhaseSamples.length,\n totalDurationMs: durations.reduce((total, value) => total + value, 0),\n averageDurationMs: average(durations),\n averageSnapshotAgeMs: average(snapshotAgeMsValues),\n maxSnapshotAgeMs:\n snapshotAgeMsValues.length > 0 ? Math.max(...snapshotAgeMsValues) : undefined,\n maxSnapshotAgeFrames:\n snapshotAgeFrameValues.length > 0\n ? Math.max(...snapshotAgeFrameValues)\n : undefined,\n byPipeline: [...byPipeline.values()]\n .map((bucket) => ({\n pipeline: bucket.pipeline,\n sampleCount: bucket.sampleCount,\n totalDurationMs: bucket.totalDurationMs,\n averageDurationMs: average(bucket.durationValues),\n averageSnapshotAgeMs: average(bucket.snapshotAgeMsValues),\n maxSnapshotAgeMs:\n bucket.snapshotAgeMsValues.length > 0\n ? Math.max(...bucket.snapshotAgeMsValues)\n : undefined,\n maxSnapshotAgeFrames:\n bucket.snapshotAgeFramesValues.length > 0\n ? Math.max(...bucket.snapshotAgeFramesValues)\n : undefined,\n }))\n .sort((left, right) => right.totalDurationMs - left.totalDurationMs),\n hottestStages,\n };\n };\n\n return {\n isEnabled() {\n return enabled;\n },\n setEnabled(nextEnabled) {\n enabled = Boolean(nextEnabled);\n },\n trackAllocation(allocation) {\n if (!enabled || allocation.signal?.aborted === true) {\n return () => {};\n }\n\n const normalized = normalizeAllocation(allocation);\n if (!allocations.has(normalized.id)) {\n allocationOrder.push(normalized.id);\n }\n allocations.set(normalized.id, normalized);\n ensureAllocationCapacity();\n updatePeakTrackedBytes();\n\n return () => {\n this.releaseAllocation(normalized.id);\n };\n },\n releaseAllocation(id) {\n const normalizedId = assertIdentifier(\"allocation.id\", id);\n const deleted = allocations.delete(normalizedId);\n if (!deleted) {\n return false;\n }\n\n const index = allocationOrder.indexOf(normalizedId);\n if (index >= 0) {\n allocationOrder.splice(index, 1);\n }\n\n return true;\n },\n recordQueue(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n queueSamples.push(normalizeQueueSample(sample));\n trimHistory(queueSamples, settings.maxRetainedQueueSamples);\n return true;\n },\n recordReadyLane(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n readyLaneSamples.push(normalizeReadyLaneSample(sample));\n trimHistory(readyLaneSamples, settings.maxRetainedReadyLaneSamples);\n return true;\n },\n recordDispatch(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dispatchSamples.push(normalizeDispatchSample(sample));\n trimHistory(dispatchSamples, settings.maxRetainedDispatches);\n return true;\n },\n recordDependencyUnlock(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dependencyUnlockSamples.push(normalizeDependencyUnlockSample(sample));\n trimHistory(\n dependencyUnlockSamples,\n settings.maxRetainedDependencyUnlockSamples\n );\n return true;\n },\n recordPipelinePhase(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n pipelinePhaseSamples.push(normalizePipelinePhaseSample(sample));\n trimHistory(\n pipelinePhaseSamples,\n settings.maxRetainedPipelinePhaseSamples\n );\n return true;\n },\n recordFrame(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n frameSamples.push(normalizeFrameSample(sample));\n trimHistory(frameSamples, settings.maxRetainedFrameSamples);\n return true;\n },\n getSnapshot() {\n const memoryByOwner = new Map<string, number>();\n const memoryByCategory = new Map<GpuResourceCategory, number>();\n for (const allocation of allocations.values()) {\n pushAggregate(memoryByOwner, allocation.owner, allocation.sizeBytes);\n pushAggregate(memoryByCategory, allocation.category, allocation.sizeBytes);\n }\n\n const totalBytes = totalTrackedBytes();\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const targetFrameTimes = frameSamples\n .map((sample) => sample.targetFrameTimeMs)\n .filter((value): value is number => value !== undefined);\n const gpuBusyTimes = frameSamples\n .map((sample) => sample.gpuBusyMs)\n .filter((value): value is number => value !== undefined);\n\n const snapshot: GpuDebugSnapshot = {\n enabled,\n adapter,\n memory: {\n totalTrackedBytes: totalBytes,\n peakTrackedBytes,\n allocationCount: allocations.size,\n trackedUsageRatio:\n adapter.memoryCapacityHintBytes !== undefined\n ? totalBytes / adapter.memoryCapacityHintBytes\n : undefined,\n byOwner: [...memoryByOwner.entries()]\n .map(([owner, bytes]) => ({ owner, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n byCategory: [...memoryByCategory.entries()]\n .map(([category, bytes]) => ({ category, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n },\n dispatch: buildDispatchSnapshot(),\n queues: buildQueueSnapshot(),\n frames: {\n sampleCount: frameSamples.length,\n latestFrameTimeMs: frameSamples[frameSamples.length - 1]?.frameTimeMs,\n averageFrameTimeMs: average(frameTimes),\n averageTargetFrameTimeMs: average(targetFrameTimes),\n droppedFrameRatio:\n frameSamples.length > 0\n ? frameSamples.filter((sample) => sample.dropped === true).length /\n frameSamples.length\n : undefined,\n averageGpuBusyMs: average(gpuBusyTimes),\n },\n dag: buildDagSnapshot(),\n pipeline: buildPipelineSnapshot(),\n limitations: LIMITATIONS,\n };\n\n return snapshot;\n },\n reset() {\n allocations.clear();\n allocationOrder.splice(0, allocationOrder.length);\n queueSamples.splice(0, queueSamples.length);\n readyLaneSamples.splice(0, readyLaneSamples.length);\n dispatchSamples.splice(0, dispatchSamples.length);\n dependencyUnlockSamples.splice(0, dependencyUnlockSamples.length);\n pipelinePhaseSamples.splice(0, pipelinePhaseSamples.length);\n frameSamples.splice(0, frameSamples.length);\n peakTrackedBytes = 0;\n },\n };\n}\n","export const physicsDebugOwner = \"physics\";\nexport const physicsWorkerQueueClasses = Object.freeze({\n simulation: \"simulation\",\n render: \"render\",\n});\nexport const defaultPhysicsWorkerProfile = \"gameplay\";\nexport const physicsSimulationStageOrder = Object.freeze([\n \"intentResolution\",\n \"broadphase\",\n \"narrowphase\",\n \"solver\",\n \"authoritativeCommit\",\n \"secondarySimulation\",\n \"animationStateInputs\",\n \"worldSnapshot\",\n \"visualFollowUp\",\n]);\n\nfunction assertIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeNumber(name, value) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction normalizeMetadata(value) {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"snapshot.metadata must be a plain object when provided.\");\n }\n\n return Object.freeze({ ...value });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst physicsWorkerProfileSpecs = {\n gameplay: {\n description:\n \"Authoritative gameplay profile that preserves rigid-body stability while scaling visual sync and contact presentation work.\",\n suggestedAllocationIds: [\n \"physics.gameplay.broadphase.grid\",\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1024,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n },\n },\n cinematic: {\n description:\n \"Cinematic profile that keeps authoritative rigid-body work stable while enabling degradable cloth and fracture assistance passes.\",\n suggestedAllocationIds: [\n \"physics.cinematic.broadphase.grid\",\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n \"physics.cinematic.fracture.proxy\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 896,\n },\n high: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1152,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 1.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 960,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 2.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 320,\n },\n medium: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n clothAssist: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.clothAssist\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.cloth.state\"],\n },\n fracturePreview: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"geometry\",\n authority: \"non-authoritative-simulation\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.fracturePreview\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 4,\n workgroupScale: 0.35,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 160,\n },\n high: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.fracture.proxy\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n ],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 224,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n },\n },\n};\n\nconst physicsWorkerDagSpecs = {\n gameplay: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: { priority: 3, dependencies: [\"animationStateInputs\"] },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n cinematic: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n clothAssist: { priority: 2, dependencies: [\"authoritativeCommit\"] },\n fracturePreview: { priority: 1, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: {\n priority: 3,\n dependencies: [\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ],\n },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n};\n\nconst physicsSimulationPlanSpecs = Object.freeze({\n gameplay: Object.freeze({\n description:\n \"Gameplay simulation plan that hands off a stable post-commit world snapshot to visual preparation.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.worldSnapshot\",\n dependencies: Object.freeze([\"animationStateInputs\"]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n cinematic: Object.freeze({\n description:\n \"Cinematic simulation plan that runs degradable secondary simulation before publishing a stable world snapshot.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"clothAssist\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.clothAssist\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"cloth-secondary-state\",\n }),\n Object.freeze({\n id: \"fracturePreview\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.fracturePreview\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"fracture-preview-state\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.worldSnapshot\",\n dependencies: Object.freeze([\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n});\n\nfunction buildPhysicsWorkerManifestJob(profileName, key, spec) {\n const label = `physics.${profileName}.${key}`;\n const dag = physicsWorkerDagSpecs[profileName][key];\n const dependencies = dag.dependencies.map(\n (dependency) => `physics.${profileName}.${dependency}`\n );\n\n return Object.freeze({\n key,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: spec.queueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: physicsDebugOwner,\n queueClass: spec.queueClass,\n jobType: label,\n tags: Object.freeze([\n \"physics\",\n profileName,\n key,\n spec.authority,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildPhysicsWorkerManifest(profileName, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: physicsDebugOwner,\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildPhysicsWorkerManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\nexport const physicsWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(physicsWorkerProfileSpecs).map(([profileName, spec]) => [\n profileName,\n buildPhysicsWorkerManifest(profileName, spec),\n ])\n )\n);\n\nexport const physicsWorkerProfileNames = Object.freeze(\n Object.keys(physicsWorkerManifests)\n);\n\nexport function getPhysicsWorkerManifest(\n profile = defaultPhysicsWorkerProfile\n) {\n const manifest = physicsWorkerManifests[profile];\n if (!manifest) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function createPhysicsSimulationPlan(\n profile = defaultPhysicsWorkerProfile\n) {\n const plan = physicsSimulationPlanSpecs[profile];\n if (!plan) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n return Object.freeze({\n profile,\n description: plan.description,\n snapshotStageId: plan.snapshotStageId,\n snapshotStability: \"post-authoritative-commit\",\n stageOrder: Object.freeze(plan.stages.map((stage) => stage.id)),\n secondarySimulationStageIds: plan.secondarySimulationStageIds,\n stages: plan.stages,\n });\n}\n\nexport function createPhysicsWorldSnapshot(input) {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new Error(\"snapshot input must be a plain object.\");\n }\n\n const profile = input.profile ?? defaultPhysicsWorkerProfile;\n if (!physicsWorkerManifests[profile]) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n const bodyCount =\n input.bodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.bodyCount\", input.bodyCount);\n const dynamicBodyCount =\n input.dynamicBodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.dynamicBodyCount\",\n input.dynamicBodyCount\n );\n const contactCount =\n input.contactCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.contactCount\", input.contactCount);\n\n return Object.freeze({\n schemaVersion: 1,\n stage: \"worldSnapshot\",\n stability: \"post-authoritative-commit\",\n profile,\n frameId: assertIdentifier(\"snapshot.frameId\", input.frameId),\n tick: assertNonNegativeInteger(\"snapshot.tick\", input.tick),\n simulationTimeMs: assertNonNegativeNumber(\n \"snapshot.simulationTimeMs\",\n input.simulationTimeMs\n ),\n authoritativeTransformRevision: assertNonNegativeInteger(\n \"snapshot.authoritativeTransformRevision\",\n input.authoritativeTransformRevision\n ),\n secondarySimulationRevision:\n input.secondarySimulationRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.secondarySimulationRevision\",\n input.secondarySimulationRevision\n ),\n animationInputRevision:\n input.animationInputRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.animationInputRevision\",\n input.animationInputRevision\n ),\n bodyCount,\n dynamicBodyCount,\n contactCount,\n includesSecondarySimulation: input.secondarySimulationRevision !== undefined,\n metadata: normalizeMetadata(input.metadata),\n });\n}\n","import {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n} from \"./chunk-CNTXT5QJ.js\";\nexport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n};\n//# sourceMappingURL=browser.js.map","import {\n clothGarmentKinds,\n clothProfileNames,\n createClothContinuityEnvelope,\n createClothRepresentationPlan,\n selectClothRepresentationBand,\n} from \"@plasius/gpu-cloth\";\nimport {\n fluidBodyKinds,\n fluidProfileNames,\n createFluidContinuityEnvelope,\n createFluidRepresentationPlan,\n selectFluidRepresentationBand,\n} from \"@plasius/gpu-fluid\";\nimport {\n createLightingBandPlan,\n defaultLightingProfile,\n getLightingProfile,\n lightingDistanceBands,\n} from \"@plasius/gpu-lighting\";\nimport {\n createDeviceProfile,\n createGpuPerformanceGovernor,\n createQualityLadderAdapter,\n} from \"@plasius/gpu-performance\";\nimport { createGpuDebugSession } from \"@plasius/gpu-debug\";\nimport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n} from \"@plasius/gpu-physics/browser\";\n\nimport { loadGltfModel } from \"./gltf-loader.js\";\n\nconst STYLE_ID = \"plasius-shared-3d-showcase-style\";\nconst DEFAULT_TITLE = \"Flag by the Sea\";\nconst DEFAULT_SUBTITLE =\n \"Shared 3D validation scene using GLTF ships, cloth, fluid continuity, adaptive performance, and telemetry.\";\nconst CAMERA_PRESETS = Object.freeze({\n integrated: Object.freeze({ yaw: -0.55, pitch: 0.34, distance: 27, target: [0, 2.2, 0] }),\n lighting: Object.freeze({ yaw: -0.28, pitch: 0.28, distance: 23, target: [0, 2.8, 0] }),\n cloth: Object.freeze({ yaw: -1.1, pitch: 0.25, distance: 15, target: [-8.4, 5.3, -1.5] }),\n fluid: Object.freeze({ yaw: -0.4, pitch: 0.18, distance: 18, target: [0, 1.2, 6] }),\n physics: Object.freeze({ yaw: -0.12, pitch: 0.27, distance: 16, target: [0, 1.8, 6.8] }),\n performance: Object.freeze({ yaw: -0.65, pitch: 0.36, distance: 24, target: [0, 2.2, 0] }),\n debug: Object.freeze({ yaw: -0.7, pitch: 0.32, distance: 24, target: [0, 2.2, 0] }),\n});\nexport const showcaseFocusModes = Object.freeze(Object.keys(CAMERA_PRESETS));\n\nconst SCENE_NOTES = Object.freeze([\n \"Ships are loaded from a GLTF asset and carry physics metadata from node extras.\",\n \"Near-field lighting uses the ray-traced-primary shadow and reflection path before stepping down by distance band.\",\n \"Cloth and fluid continuity stay coherent across near, mid, far, and horizon bands.\",\n \"Performance pressure reduces visual detail before authoritative collision motion is touched.\",\n]);\n\nconst UNIT_BOX_MESH = Object.freeze({\n positions: Object.freeze([\n -0.5, -0.5, -0.5,\n 0.5, -0.5, -0.5,\n 0.5, 0.5, -0.5,\n -0.5, 0.5, -0.5,\n -0.5, -0.5, 0.5,\n 0.5, -0.5, 0.5,\n 0.5, 0.5, 0.5,\n -0.5, 0.5, 0.5,\n ]),\n indices: Object.freeze([\n 0, 1, 2, 0, 2, 3,\n 5, 4, 7, 5, 7, 6,\n 4, 0, 3, 4, 3, 7,\n 1, 5, 6, 1, 6, 2,\n 3, 2, 6, 3, 6, 7,\n 4, 5, 1, 4, 1, 0,\n ]),\n});\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n}\n\nfunction injectStyles() {\n if (document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n :root {\n color-scheme: light;\n --plasius-paper: #f4f7f8;\n --plasius-ink: #152028;\n --plasius-muted: #5c6f7b;\n --plasius-accent: #8f5634;\n --plasius-panel: rgba(255, 255, 255, 0.82);\n --plasius-border: rgba(21, 32, 40, 0.12);\n --plasius-shadow: 0 20px 48px rgba(15, 24, 31, 0.16);\n }\n * {\n box-sizing: border-box;\n }\n body {\n margin: 0;\n min-height: 100vh;\n font-family: \"Fraunces\", \"Iowan Old Style\", serif;\n color: var(--plasius-ink);\n background:\n radial-gradient(circle at top left, rgba(255, 247, 238, 0.92), transparent 34%),\n linear-gradient(180deg, #f6f8fb 0%, #d2dee6 48%, #b6c4ce 100%);\n }\n .plasius-demo {\n width: min(1560px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 40px;\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero,\n .plasius-demo__layout {\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero {\n grid-template-columns: minmax(0, 1.5fr) minmax(320px, 0.85fr);\n align-items: start;\n }\n .plasius-panel {\n border: 1px solid var(--plasius-border);\n border-radius: 24px;\n background: var(--plasius-panel);\n box-shadow: var(--plasius-shadow);\n backdrop-filter: blur(12px);\n }\n .plasius-demo__hero-card,\n .plasius-demo__status {\n padding: 20px 22px;\n }\n .plasius-demo__eyebrow {\n margin: 0 0 8px;\n text-transform: uppercase;\n letter-spacing: 0.18em;\n font-size: 12px;\n color: rgba(21, 32, 40, 0.56);\n }\n .plasius-demo h1,\n .plasius-demo h2,\n .plasius-demo h3 {\n margin: 0;\n }\n .plasius-demo__lead {\n margin: 12px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n max-width: 760px;\n }\n .plasius-demo__status-badge {\n width: fit-content;\n margin: 0;\n padding: 8px 12px;\n border-radius: 999px;\n background: rgba(143, 86, 52, 0.12);\n color: var(--plasius-accent);\n font-weight: 700;\n }\n .plasius-demo__status-text {\n margin: 10px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n }\n .plasius-demo__layout {\n grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.68fr);\n align-items: start;\n }\n .plasius-demo__canvas-panel {\n padding: 18px;\n position: relative;\n }\n .plasius-demo__canvas {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: block;\n border-radius: 20px;\n border: 1px solid rgba(21, 32, 40, 0.08);\n background: linear-gradient(180deg, #dce8ef 0%, #a9bfd0 42%, #0f5168 42%, #092433 100%);\n }\n .plasius-demo__toolbar {\n position: absolute;\n top: 26px;\n left: 26px;\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n }\n .plasius-demo button,\n .plasius-demo label,\n .plasius-demo select {\n font-family: \"JetBrains Mono\", monospace;\n font-size: 13px;\n }\n .plasius-demo button,\n .plasius-demo .plasius-toggle,\n .plasius-demo select {\n border: 1px solid rgba(21, 32, 40, 0.12);\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.84);\n color: var(--plasius-ink);\n padding: 10px 14px;\n }\n .plasius-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .plasius-demo__sidebar {\n display: grid;\n gap: 18px;\n }\n .plasius-demo__card {\n padding: 18px;\n }\n .plasius-demo__metrics,\n .plasius-demo__metrics li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .plasius-demo__metrics {\n margin-top: 12px;\n display: grid;\n gap: 8px;\n color: var(--plasius-muted);\n line-height: 1.55;\n }\n .plasius-demo__metrics li {\n border-top: 1px solid rgba(21, 32, 40, 0.08);\n padding-top: 8px;\n }\n .plasius-demo__legend {\n position: absolute;\n right: 24px;\n bottom: 24px;\n padding: 10px 14px;\n border-radius: 16px;\n background: rgba(255, 255, 255, 0.84);\n border: 1px solid rgba(21, 32, 40, 0.1);\n color: var(--plasius-muted);\n font-size: 12px;\n line-height: 1.45;\n }\n .plasius-demo__legend strong {\n display: block;\n color: var(--plasius-ink);\n margin-bottom: 4px;\n }\n .plasius-demo__footer {\n margin-top: 4px;\n color: rgba(21, 32, 40, 0.66);\n font-size: 13px;\n line-height: 1.6;\n }\n @media (max-width: 1200px) {\n .plasius-demo__hero,\n .plasius-demo__layout {\n grid-template-columns: 1fr;\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction mix(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction vec3(x = 0, y = 0, z = 0) {\n return { x, y, z };\n}\n\nfunction addVec3(a, b) {\n return vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\nfunction subVec3(a, b) {\n return vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction scaleVec3(a, s) {\n return vec3(a.x * s, a.y * s, a.z * s);\n}\n\nfunction dotVec3(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nfunction crossVec3(a, b) {\n return vec3(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x\n );\n}\n\nfunction lengthVec3(a) {\n return Math.hypot(a.x, a.y, a.z);\n}\n\nfunction normalizeVec3(a) {\n const length = lengthVec3(a) || 1;\n return vec3(a.x / length, a.y / length, a.z / length);\n}\n\nfunction reflectVec3(vector, normal) {\n const unitNormal = normalizeVec3(normal);\n return subVec3(vector, scaleVec3(unitNormal, 2 * dotVec3(vector, unitNormal)));\n}\n\nfunction rotateY(point, angle) {\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n return vec3(\n point.x * cosine - point.z * sine,\n point.y,\n point.x * sine + point.z * cosine\n );\n}\n\nfunction transformPoint(point, transform) {\n const scale =\n typeof transform.scale === \"number\"\n ? { x: transform.scale, y: transform.scale, z: transform.scale }\n : transform.scale;\n const scaled = vec3(point.x * scale.x, point.y * scale.y, point.z * scale.z);\n const rotated = rotateY(scaled, transform.rotationY);\n return addVec3(rotated, transform.position);\n}\n\nfunction projectPoint(point, camera, viewport) {\n const relative = subVec3(point, camera.eye);\n const viewX = dotVec3(relative, camera.right);\n const viewY = dotVec3(relative, camera.up);\n const viewZ = dotVec3(relative, camera.forward);\n if (viewZ <= 0.1) {\n return null;\n }\n const focal = 1 / Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (viewX * focal) / (viewZ * camera.aspect);\n const ndcY = (viewY * focal) / viewZ;\n return {\n x: (ndcX * 0.5 + 0.5) * viewport.width,\n y: (-ndcY * 0.5 + 0.5) * viewport.height,\n depth: viewZ,\n };\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const r = Math.round(clamp(color.r, 0, 1) * 255);\n const g = Math.round(clamp(color.g, 0, 1) * 255);\n const b = Math.round(clamp(color.b, 0, 1) * 255);\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction projectShadowPoint(point, lightDir, planeY) {\n const shadowDir = scaleVec3(lightDir, -1);\n if (Math.abs(shadowDir.y) < 0.0001) {\n return null;\n }\n\n const distance = (planeY - point.y) / shadowDir.y;\n if (!Number.isFinite(distance) || distance < 0) {\n return null;\n }\n\n return addVec3(point, scaleVec3(shadowDir, distance));\n}\n\nfunction shadeColor(base, normal, lightDir, heightBias = 0, accent = 0) {\n const diffuse = clamp(dotVec3(normalizeVec3(normal), lightDir), 0, 1);\n const brightness = 0.24 + diffuse * 0.72 + heightBias * 0.08 + accent;\n return {\n r: clamp(base.r * brightness, 0, 1),\n g: clamp(base.g * brightness, 0, 1),\n b: clamp(base.b * (brightness + 0.03), 0, 1),\n };\n}\n\nfunction buildCamera(state, canvas) {\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const yaw = state.camera.yaw ?? preset.yaw;\n const pitch = state.camera.pitch ?? preset.pitch;\n const distance = state.camera.distance ?? preset.distance;\n const target = state.camera.target ?? vec3(...preset.target);\n const eye = vec3(\n target.x + Math.sin(yaw) * Math.cos(pitch) * distance,\n target.y + Math.sin(pitch) * distance,\n target.z + Math.cos(yaw) * Math.cos(pitch) * distance\n );\n const forward = normalizeVec3(subVec3(target, eye));\n const right = normalizeVec3(crossVec3(forward, vec3(0, 1, 0)));\n const up = normalizeVec3(crossVec3(right, forward));\n return {\n eye,\n target,\n forward,\n right,\n up,\n fov: 54,\n aspect: canvas.width / canvas.height,\n };\n}\n\nfunction buildTrianglesFromMesh(mesh, transform, baseColor, camera, viewport, triangles, accent = 0) {\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const aIndex = mesh.indices[index] * 3;\n const bIndex = mesh.indices[index + 1] * 3;\n const cIndex = mesh.indices[index + 2] * 3;\n\n const a = transformPoint(\n vec3(mesh.positions[aIndex], mesh.positions[aIndex + 1], mesh.positions[aIndex + 2]),\n transform\n );\n const b = transformPoint(\n vec3(mesh.positions[bIndex], mesh.positions[bIndex + 1], mesh.positions[bIndex + 2]),\n transform\n );\n const c = transformPoint(\n vec3(mesh.positions[cIndex], mesh.positions[cIndex + 1], mesh.positions[cIndex + 2]),\n transform\n );\n\n const ab = subVec3(b, a);\n const ac = subVec3(c, a);\n const normal = normalizeVec3(crossVec3(ab, ac));\n const viewDir = normalizeVec3(subVec3(camera.eye, a));\n if (dotVec3(normal, viewDir) <= 0) {\n continue;\n }\n\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor,\n accent,\n });\n }\n}\n\nfunction createPerformanceGovernor() {\n const fluidDetail = createQualityLadderAdapter({\n id: \"fluid-detail\",\n domain: \"geometry\",\n levels: [\n { id: \"low\", config: { nearResolution: 10, midResolution: 6, splashCount: 10 }, estimatedCostMs: 0.8 },\n { id: \"medium\", config: { nearResolution: 16, midResolution: 8, splashCount: 18 }, estimatedCostMs: 1.4 },\n { id: \"high\", config: { nearResolution: 24, midResolution: 12, splashCount: 28 }, estimatedCostMs: 2.4 },\n ],\n initialLevel: \"high\",\n });\n\n const clothDetail = createQualityLadderAdapter({\n id: \"cloth-detail\",\n domain: \"cloth\",\n levels: [\n { id: \"low\", config: { cols: 10, rows: 7 }, estimatedCostMs: 0.7 },\n { id: \"medium\", config: { cols: 16, rows: 11 }, estimatedCostMs: 1.3 },\n { id: \"high\", config: { cols: 24, rows: 16 }, estimatedCostMs: 2.1 },\n ],\n initialLevel: \"high\",\n });\n\n const lightingDetail = createQualityLadderAdapter({\n id: \"lighting-detail\",\n domain: \"lighting\",\n levels: [\n { id: \"low\", config: { shadowStrength: 0.18, reflectionStrength: 0.08 }, estimatedCostMs: 0.5 },\n { id: \"medium\", config: { shadowStrength: 0.34, reflectionStrength: 0.16 }, estimatedCostMs: 1.0 },\n { id: \"high\", config: { shadowStrength: 0.5, reflectionStrength: 0.24 }, estimatedCostMs: 1.8 },\n ],\n initialLevel: \"high\",\n });\n\n const governor = createGpuPerformanceGovernor({\n device: createDeviceProfile({\n deviceClass: \"desktop\",\n mode: \"flat\",\n refreshRateHz: 60,\n supportedFrameRates: [60, 90],\n supportsWebGpu: true,\n }),\n modules: [fluidDetail, clothDetail, lightingDetail],\n adaptation: {\n sampleWindowSize: 10,\n minimumSamplesBeforeAdjustment: 4,\n degradeCooldownFrames: 1,\n upgradeCooldownFrames: 4,\n minStableFramesForRecovery: 3,\n },\n });\n\n return { governor, fluidDetail, clothDetail, lightingDetail };\n}\n\nfunction buildDemoDom(root, options) {\n root.innerHTML = `\n <main class=\"plasius-demo\">\n <section class=\"plasius-demo__hero\">\n <section class=\"plasius-panel plasius-demo__hero-card\">\n <p class=\"plasius-demo__eyebrow\">${options.packageName}</p>\n <h1>${options.title}</h1>\n <p class=\"plasius-demo__lead\">${options.subtitle}</p>\n </section>\n <section class=\"plasius-panel plasius-demo__status\">\n <p id=\"demoStatus\" class=\"plasius-demo__status-badge\">Booting 3D scene…</p>\n <p id=\"demoDetails\" class=\"plasius-demo__status-text\">\n Preparing GLTF assets, cloth and fluid continuity plans, and adaptive quality metadata.\n </p>\n </section>\n </section>\n <section class=\"plasius-demo__layout\">\n <section class=\"plasius-panel plasius-demo__canvas-panel\">\n <canvas id=\"demoCanvas\" class=\"plasius-demo__canvas\" width=\"1280\" height=\"720\"></canvas>\n <div class=\"plasius-demo__toolbar\">\n <button id=\"pauseButton\" type=\"button\">Pause</button>\n <label class=\"plasius-toggle\">\n <input id=\"stressToggle\" type=\"checkbox\" />\n Stress mode\n </label>\n <label class=\"plasius-toggle\">\n Focus\n <select id=\"focusMode\">\n <option value=\"integrated\">integrated</option>\n <option value=\"lighting\">lighting</option>\n <option value=\"cloth\">cloth</option>\n <option value=\"fluid\">fluid</option>\n <option value=\"physics\">physics</option>\n <option value=\"performance\">performance</option>\n <option value=\"debug\">debug</option>\n </select>\n </label>\n </div>\n <div class=\"plasius-demo__legend\">\n <strong>Scene</strong>\n GLTF ships carry collision metadata.<br />\n Flag cloth and ocean waves scale by distance band.<br />\n Ray-traced shadow and reflection style is preserved near the camera.\n </div>\n </section>\n <aside class=\"plasius-demo__sidebar\">\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Scene State</h2>\n <ul id=\"sceneMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Quality + Budgets</h2>\n <ul id=\"qualityMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Debug Telemetry</h2>\n <ul id=\"debugMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Notes</h2>\n <ul id=\"sceneNotes\" class=\"plasius-demo__metrics\"></ul>\n </section>\n </aside>\n </section>\n <p class=\"plasius-demo__footer\">\n This visual example is shared across the GPU packages to keep manual validation fast and consistent.\n </p>\n </main>\n `;\n\n return {\n status: root.querySelector(\"#demoStatus\"),\n details: root.querySelector(\"#demoDetails\"),\n canvas: root.querySelector(\"#demoCanvas\"),\n pauseButton: root.querySelector(\"#pauseButton\"),\n stressToggle: root.querySelector(\"#stressToggle\"),\n focusMode: root.querySelector(\"#focusMode\"),\n sceneMetrics: root.querySelector(\"#sceneMetrics\"),\n qualityMetrics: root.querySelector(\"#qualityMetrics\"),\n debugMetrics: root.querySelector(\"#debugMetrics\"),\n sceneNotes: root.querySelector(\"#sceneNotes\"),\n };\n}\n\nfunction buildSceneSnapshot(state, shipModel) {\n return Object.freeze({\n focus: state.focus,\n frame: state.frame,\n time: state.time,\n stress: state.stress,\n collisions: state.contactCount,\n collisionCount: state.collisionCount,\n collisionFlash: state.collisionFlash,\n sprays: Object.freeze(\n state.sprays.map((spray) =>\n Object.freeze({\n life: spray.life,\n position: Object.freeze({ ...spray.position }),\n velocity: Object.freeze({ ...spray.velocity }),\n })\n )\n ),\n ships: Object.freeze(\n state.ships.map((ship) =>\n Object.freeze({\n id: ship.id,\n position: Object.freeze({ ...ship.position }),\n velocity: Object.freeze({ ...ship.velocity }),\n rotationY: ship.rotationY,\n angularVelocity: ship.angularVelocity,\n tint: Object.freeze({ ...ship.tint }),\n })\n )\n ),\n waveImpulses: Object.freeze(\n state.waveImpulses.map((impulse) =>\n Object.freeze({\n x: impulse.x,\n z: impulse.z,\n strength: impulse.strength,\n radius: impulse.radius,\n life: impulse.life,\n })\n )\n ),\n physics: Object.freeze({\n profile: state.physics.profile,\n plan: state.physics.plan,\n manifest: state.physics.manifest,\n snapshot: state.physics.snapshot,\n shipPhysics: shipModel?.physics ?? null,\n }),\n });\n}\n\nfunction resolveSceneDescription(state, options, shipModel) {\n const scene = buildSceneSnapshot(state, shipModel);\n if (typeof options.describeState !== \"function\") {\n return { scene, description: null };\n }\n\n const description = options.describeState(state.packageState, scene) ?? null;\n return { scene, description };\n}\n\nfunction updatePackageState(state, options, shipModel, dt) {\n if (typeof options.updateState !== \"function\") {\n return;\n }\n\n const scene = buildSceneSnapshot(state, shipModel);\n const nextState = options.updateState(state.packageState, scene, dt);\n if (typeof nextState !== \"undefined\") {\n state.packageState = nextState;\n }\n}\n\nfunction normalizeColorOverride(color, fallback) {\n if (!color || typeof color !== \"object\") {\n return fallback;\n }\n\n return {\n r: typeof color.r === \"number\" ? color.r : fallback.r,\n g: typeof color.g === \"number\" ? color.g : fallback.g,\n b: typeof color.b === \"number\" ? color.b : fallback.b,\n };\n}\n\nfunction readVisualNumber(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction resolveVisualConfig(nearLighting, lightingSnapshot, customVisuals = {}) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const defaults = {\n skyTop: premiumShadows ? \"#f0f7fb\" : \"#e8f1f7\",\n skyMid: premiumShadows ? \"#c7d9e5\" : \"#b9ceda\",\n skyBottom: premiumShadows ? \"#84a7bd\" : \"#7b9bb0\",\n seaTop: premiumShadows ? \"#235064\" : \"#264c5f\",\n seaMid: premiumShadows ? \"#153e53\" : \"#173d4f\",\n seaBottom: \"#0b2433\",\n sunCore: \"rgba(255, 244, 210, 0.9)\",\n reflectionStrength: lightingSnapshot.currentLevel.config.reflectionStrength,\n shadowAccent: lightingSnapshot.currentLevel.config.shadowStrength,\n waveAmplitude: 1,\n waveDirection: { x: 0.86, z: 0.34 },\n wavePhaseSpeed: 1,\n wakeStrength: 0.24,\n wakeLength: 15,\n collisionRippleStrength: 0.34,\n waterNear: { r: 0.12, g: 0.36, b: 0.46 },\n waterFar: { r: 0.28, g: 0.56, b: 0.68 },\n harborWall: { r: 0.48, g: 0.4, b: 0.32 },\n harborDeck: { r: 0.5, g: 0.34, b: 0.22 },\n harborTower: { r: 0.34, g: 0.32, b: 0.36 },\n flagColor: { r: 0.76, g: 0.24, b: 0.18 },\n flagMotion: 1,\n };\n\n return {\n skyTop: typeof customVisuals.skyTop === \"string\" ? customVisuals.skyTop : defaults.skyTop,\n skyMid: typeof customVisuals.skyMid === \"string\" ? customVisuals.skyMid : defaults.skyMid,\n skyBottom:\n typeof customVisuals.skyBottom === \"string\" ? customVisuals.skyBottom : defaults.skyBottom,\n seaTop: typeof customVisuals.seaTop === \"string\" ? customVisuals.seaTop : defaults.seaTop,\n seaMid: typeof customVisuals.seaMid === \"string\" ? customVisuals.seaMid : defaults.seaMid,\n seaBottom:\n typeof customVisuals.seaBottom === \"string\" ? customVisuals.seaBottom : defaults.seaBottom,\n sunCore:\n typeof customVisuals.sunCore === \"string\" ? customVisuals.sunCore : defaults.sunCore,\n reflectionStrength: readVisualNumber(\n customVisuals.reflectionStrength,\n defaults.reflectionStrength\n ),\n shadowAccent: readVisualNumber(customVisuals.shadowAccent, defaults.shadowAccent),\n waveAmplitude: readVisualNumber(customVisuals.waveAmplitude, defaults.waveAmplitude),\n waveDirection:\n customVisuals.waveDirection &&\n typeof customVisuals.waveDirection.x === \"number\" &&\n typeof customVisuals.waveDirection.z === \"number\"\n ? { x: customVisuals.waveDirection.x, z: customVisuals.waveDirection.z }\n : defaults.waveDirection,\n wavePhaseSpeed: readVisualNumber(customVisuals.wavePhaseSpeed, defaults.wavePhaseSpeed),\n wakeStrength: readVisualNumber(customVisuals.wakeStrength, defaults.wakeStrength),\n wakeLength: readVisualNumber(customVisuals.wakeLength, defaults.wakeLength),\n collisionRippleStrength: readVisualNumber(\n customVisuals.collisionRippleStrength,\n defaults.collisionRippleStrength\n ),\n waterNear: normalizeColorOverride(customVisuals.waterNear, defaults.waterNear),\n waterFar: normalizeColorOverride(customVisuals.waterFar, defaults.waterFar),\n harborWall: normalizeColorOverride(customVisuals.harborWall, defaults.harborWall),\n harborDeck: normalizeColorOverride(customVisuals.harborDeck, defaults.harborDeck),\n harborTower: normalizeColorOverride(customVisuals.harborTower, defaults.harborTower),\n flagColor: normalizeColorOverride(customVisuals.flagColor, defaults.flagColor),\n flagMotion: readVisualNumber(customVisuals.flagMotion, defaults.flagMotion),\n };\n}\n\nfunction buildClothSurface(model, state, meshDetail, visuals) {\n const clothPlan = createClothRepresentationPlan({\n garmentId: \"shore-flag\",\n kind: state.focus === \"cloth\" ? \"flag\" : clothGarmentKinds[0],\n profile: state.focus === \"cloth\" ? \"cinematic\" : clothProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 18,\n midFieldMaxMeters: 55,\n farFieldMaxMeters: 180,\n });\n const cameraDistance = lengthVec3(subVec3(state.camera.target, state.camera.eye ?? vec3(...CAMERA_PRESETS[state.focus].target)));\n const band = selectClothRepresentationBand(cameraDistance, clothPlan.thresholds);\n const representation =\n clothPlan.representations.find((entry) => entry.band === band) ?? clothPlan.representations[0];\n const continuity = createClothContinuityEnvelope({ garmentId: \"shore-flag\" });\n\n const cols = meshDetail.cols;\n const rows = meshDetail.rows;\n const origin = vec3(-3.5, 5.9, 2.4);\n const width = 4.8;\n const height = 2.7;\n const positions = [];\n const indices = [];\n const time = state.time;\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const gust =\n Math.sin(time * 1.9 + v * 3.2 + u * 2.1) *\n continuity.broadMotionFloor *\n visuals.flagMotion;\n const wrinkle =\n Math.sin(time * 4.4 + u * 9.2 + v * 5.6) *\n continuity.wrinkleFloor *\n 0.22 *\n Math.max(0.55, visuals.flagMotion);\n const x = origin.x + u * 1.8 + gust * 0.55 * (u * 0.9);\n const y = origin.y - height * v + wrinkle * 0.2;\n const z = origin.z + width * u + gust * 0.72 * (u * 0.85);\n const flap =\n Math.cos(time * 2.7 + u * 7.4 + v * 3.8) *\n continuity.broadMotionFloor *\n 0.28 *\n visuals.flagMotion;\n positions.push(vec3(x + flap, y, z));\n }\n }\n\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n return {\n clothPlan,\n band,\n representation,\n continuity,\n color: visuals.flagColor,\n positions,\n indices,\n grid: { rows, cols },\n };\n}\n\nfunction resolveWaveDirection(state) {\n const direction = state.demoVisuals?.waveDirection;\n if (\n direction &&\n typeof direction === \"object\" &&\n typeof direction.x === \"number\" &&\n typeof direction.z === \"number\"\n ) {\n return normalizeVec3(vec3(direction.x, 0, direction.z));\n }\n\n return normalizeVec3(vec3(0.86, 0, 0.34));\n}\n\nfunction sampleShipWake(state, x, z, time) {\n const wakeStrength = readVisualNumber(state.demoVisuals?.wakeStrength, 0.24);\n const wakeLength = readVisualNumber(state.demoVisuals?.wakeLength, 15);\n let total = 0;\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.05) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const delta = vec3(x - ship.position.x, 0, z - ship.position.z);\n const along = dotVec3(delta, behind);\n if (along < 0 || along > wakeLength) {\n continue;\n }\n\n const cross = Math.abs(dotVec3(delta, lateral));\n const width = 0.9 + along * 0.2;\n if (cross > width * 3.2) {\n continue;\n }\n\n const envelope =\n Math.exp(-along * 0.14) * Math.exp(-((cross * cross) / Math.max(0.4, width * width * 2.4)));\n total += Math.sin(along * 1.6 - time * 4.2) * speed * wakeStrength * envelope;\n }\n\n return total;\n}\n\nfunction sampleWaveImpulses(state, x, z, time) {\n const rippleStrength = readVisualNumber(state.demoVisuals?.collisionRippleStrength, 0.34);\n let total = 0;\n\n for (const impulse of state.waveImpulses) {\n const dx = x - impulse.x;\n const dz = z - impulse.z;\n const distance = Math.hypot(dx, dz);\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n if (distance > radius * 2.8) {\n continue;\n }\n\n const phase = distance * 1.8 - (1 - impulse.life) * 10 - time * 0.4;\n const envelope = Math.exp(-distance / Math.max(0.1, radius)) * impulse.life;\n total += Math.sin(phase) * impulse.strength * rippleStrength * envelope * 0.18;\n }\n\n return total;\n}\n\nfunction sampleWave(state, x, z, time) {\n const direction = resolveWaveDirection(state);\n const lateral = vec3(-direction.z, 0, direction.x);\n const along = x * direction.x + z * direction.z;\n const cross = x * lateral.x + z * lateral.z;\n const phaseSpeed = readVisualNumber(state.demoVisuals?.wavePhaseSpeed, 1);\n const amplitude = readVisualNumber(state.demoVisuals?.waveAmplitude, 1);\n const base =\n Math.sin(along * 0.22 - time * 1.12 * phaseSpeed) * 0.42 +\n Math.cos(along * 0.11 + cross * 0.07 - time * 0.78 * phaseSpeed) * 0.26 +\n Math.sin(cross * 0.19 - time * 1.34 * phaseSpeed) * 0.16;\n\n return (\n base * amplitude +\n sampleShipWake(state, x, z, time) +\n sampleWaveImpulses(state, x, z, time)\n );\n}\n\nfunction buildWaterBands(state, fluidDetail, visuals) {\n const fluidPlan = createFluidRepresentationPlan({\n fluidBodyId: \"harbor\",\n kind: state.focus === \"fluid\" ? \"ocean\" : fluidBodyKinds[0],\n profile: state.focus === \"fluid\" ? \"cinematic\" : fluidProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 40,\n midFieldMaxMeters: 150,\n farFieldMaxMeters: 600,\n });\n\n const bandMeshes = [];\n const bandExtents = Object.freeze([\n { band: \"near\", width: 20, depth: 18, step: 1, y: 0.2 },\n { band: \"mid\", width: 34, depth: 28, step: 2, y: 0.05 },\n { band: \"far\", width: 54, depth: 42, step: 3.5, y: -0.05 },\n { band: \"horizon\", width: 80, depth: 76, step: 7, y: -0.14 },\n ]);\n\n for (const bandSpec of bandExtents) {\n const representation =\n fluidPlan.representations.find((entry) => entry.band === bandSpec.band) ??\n fluidPlan.representations[0];\n const continuity = createFluidContinuityEnvelope({ fluidBodyId: \"harbor\" });\n const bandResolution =\n bandSpec.band === \"near\"\n ? fluidDetail.nearResolution\n : bandSpec.band === \"mid\"\n ? fluidDetail.midResolution\n : bandSpec.band === \"far\"\n ? 5\n : 3;\n const cols = Math.max(4, bandResolution * 2);\n const rows = Math.max(4, bandResolution + 2);\n const positions = [];\n const indices = [];\n const originX = -bandSpec.width * 0.5;\n const originZ = -6;\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const x = originX + bandSpec.width * u;\n const z = originZ + bandSpec.depth * v;\n const y =\n bandSpec.y +\n sampleWave(state, x, z, state.time) *\n continuity.amplitudeFloor *\n (bandSpec.band === \"near\" ? 0.9 : bandSpec.band === \"mid\" ? 0.55 : 0.3);\n positions.push(vec3(x, y, z));\n }\n }\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n bandMeshes.push({\n band: bandSpec.band,\n representation,\n continuity,\n rows,\n cols,\n positions,\n indices,\n color:\n bandSpec.band === \"near\"\n ? visuals.waterNear\n : bandSpec.band === \"mid\"\n ? {\n r: mix(visuals.waterNear.r, visuals.waterFar.r, 0.4),\n g: mix(visuals.waterNear.g, visuals.waterFar.g, 0.4),\n b: mix(visuals.waterNear.b, visuals.waterFar.b, 0.4),\n }\n : bandSpec.band === \"far\"\n ? visuals.waterFar\n : {\n r: mix(visuals.waterFar.r, 0.76, 0.2),\n g: mix(visuals.waterFar.g, 0.78, 0.2),\n b: mix(visuals.waterFar.b, 0.82, 0.2),\n },\n });\n }\n\n return { fluidPlan, bandMeshes };\n}\n\nfunction createSceneState(options) {\n const { governor, fluidDetail, clothDetail, lightingDetail } = createPerformanceGovernor();\n const physicsProfile = defaultPhysicsWorkerProfile;\n const physicsPlan = createPhysicsSimulationPlan(physicsProfile);\n const physicsManifest = getPhysicsWorkerManifest(physicsProfile);\n const debugSession = createGpuDebugSession({\n enabled: true,\n adapter: {\n label: \"3D showcase\",\n memoryCapacityHintBytes: 6 * 1024 * 1024 * 1024,\n coreCountHint: 12,\n },\n });\n debugSession.trackAllocation({\n id: \"showcase.color\",\n owner: \"renderer\",\n category: \"texture\",\n sizeBytes: 1280 * 720 * 4,\n label: \"Main color buffer\",\n });\n debugSession.trackAllocation({\n id: \"showcase.shadow-impression\",\n owner: \"lighting\",\n category: \"texture\",\n sizeBytes: 12 * 1024 * 1024,\n label: \"Shadow impression atlas\",\n });\n\n return {\n focus: options.focus,\n governor,\n fluidDetail,\n clothDetail,\n lightingDetail,\n debugSession,\n packageState: undefined,\n demoDescription: null,\n demoVisuals: null,\n time: 0,\n lastTimeMs: null,\n paused: false,\n stress: false,\n camera: {\n ...CAMERA_PRESETS[options.focus],\n target: vec3(...CAMERA_PRESETS[options.focus].target),\n },\n ships: [\n {\n id: \"northwind\",\n position: vec3(-5.2, 0, 7.2),\n velocity: vec3(2.1, 0, -1.6),\n rotationY: 0.42,\n angularVelocity: 0.18,\n tint: { r: 0.62, g: 0.39, b: 0.23 },\n },\n {\n id: \"tidecaller\",\n position: vec3(4.8, 0, 4.4),\n velocity: vec3(-1.85, 0, 1.25),\n rotationY: -2.62,\n angularVelocity: -0.14,\n tint: { r: 0.48, g: 0.28, b: 0.19 },\n },\n ],\n sprays: [],\n waveImpulses: [],\n frame: 0,\n contactCount: 0,\n collisionCount: 0,\n collisionFlash: 0,\n physics: {\n profile: physicsProfile,\n plan: physicsPlan,\n manifest: physicsManifest,\n snapshot: null,\n },\n shipModel: null,\n };\n}\n\nfunction setListContent(element, values) {\n element.innerHTML = values.map((value) => `<li>${value}</li>`).join(\"\");\n}\n\nfunction drawSkyAndShore(ctx, canvas, state, nearLighting, reflectionStrength, shadowStrength, visuals) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const sky = ctx.createLinearGradient(0, 0, 0, canvas.height * 0.5);\n sky.addColorStop(0, visuals.skyTop);\n sky.addColorStop(0.6, visuals.skyMid);\n sky.addColorStop(1, visuals.skyBottom);\n ctx.fillStyle = sky;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const shoreline = ctx.createLinearGradient(0, canvas.height * 0.45, 0, canvas.height);\n shoreline.addColorStop(0, visuals.seaTop);\n shoreline.addColorStop(0.52, visuals.seaMid);\n shoreline.addColorStop(1, visuals.seaBottom);\n ctx.fillStyle = shoreline;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n const sunX = mix(canvas.width * 0.16, canvas.width * 0.84, (Math.sin(state.time * 0.12) + 1) * 0.5);\n const sunY = canvas.height * 0.14 + Math.cos(state.time * 0.12) * 22;\n const sun = ctx.createRadialGradient(sunX, sunY, 10, sunX, sunY, 90);\n sun.addColorStop(0, visuals.sunCore);\n sun.addColorStop(1, \"rgba(255, 244, 210, 0)\");\n ctx.fillStyle = sun;\n ctx.beginPath();\n ctx.arc(sunX, sunY, 90, 0, Math.PI * 2);\n ctx.fill();\n\n const track = ctx.createLinearGradient(sunX, canvas.height * 0.46, sunX, canvas.height * 0.96);\n track.addColorStop(0, `rgba(255, 243, 214, ${0.08 + reflectionStrength * 0.18})`);\n track.addColorStop(0.42, `rgba(224, 242, 255, ${0.04 + reflectionStrength * 0.2})`);\n track.addColorStop(1, \"rgba(224, 242, 255, 0)\");\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = track;\n ctx.beginPath();\n ctx.ellipse(sunX, canvas.height * 0.72, 46 + shadowStrength * 60, canvas.height * 0.26, 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n if (state.collisionFlash > 0.01) {\n ctx.fillStyle = `rgba(255, 243, 228, ${state.collisionFlash * 0.14})`;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n}\n\nfunction drawTriangles(ctx, triangles, lightDir, reflectionStrength, camera, shadowStrength) {\n triangles.sort((left, right) => right.depth - left.depth);\n for (const triangle of triangles) {\n const surfaceNormal = normalizeVec3(triangle.normal);\n const shaded = shadeColor(\n triangle.baseColor,\n surfaceNormal,\n lightDir,\n clamp((triangle.worldCenter.y + 3) / 10, 0, 1),\n triangle.accent\n );\n const reflection = triangle.worldCenter.y < 0.8 ? reflectionStrength : 0;\n const viewDir = normalizeVec3(subVec3(camera.eye, triangle.worldCenter));\n const reflectedLight = reflectVec3(scaleVec3(lightDir, -1), surfaceNormal);\n const gloss = triangle.worldCenter.y < 0.9 ? 1 : triangle.accent > 0.05 ? 0.55 : 0.3;\n const specular = Math.pow(clamp(dotVec3(reflectedLight, viewDir), 0, 1), triangle.worldCenter.y < 0.9 ? 18 : 12) * gloss;\n const occlusion = triangle.worldCenter.y < 0.9 ? shadowStrength * 0.035 : 0;\n const fill = colorToRgba(\n {\n r: clamp(shaded.r + reflection * 0.08 + specular * 0.14 - occlusion, 0, 1),\n g: clamp(shaded.g + reflection * 0.08 + specular * 0.15 - occlusion, 0, 1),\n b: clamp(shaded.b + reflection * 0.16 + specular * 0.2 - occlusion * 0.5, 0, 1),\n },\n 0.98\n );\n ctx.fillStyle = fill;\n ctx.beginPath();\n ctx.moveTo(triangle.points[0].x, triangle.points[0].y);\n ctx.lineTo(triangle.points[1].x, triangle.points[1].y);\n ctx.lineTo(triangle.points[2].x, triangle.points[2].y);\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction renderProjectedShadow(ctx, worldPoints, camera, viewport, lightDir, options = {}) {\n const planeY = options.planeY ?? 0;\n const projected = worldPoints\n .map((point) => projectShadowPoint(point, lightDir, planeY))\n .filter(Boolean)\n .map((point) => projectPoint(point, camera, viewport))\n .filter(Boolean);\n\n if (projected.length < 3) {\n return;\n }\n\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = options.color ?? `rgba(12, 24, 36, ${clamp(options.alpha ?? 0.16, 0, 0.5)})`;\n ctx.shadowColor = options.color ?? \"rgba(12, 24, 36, 0.22)\";\n ctx.shadowBlur = options.blur ?? 18;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].x, projected[index].y);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction pushHarborGeometry(camera, viewport, triangles, visuals) {\n const harborObjects = [\n {\n position: vec3(-8.2, 1.1, -0.9),\n rotationY: -0.16,\n scale: { x: 5.4, y: 2.4, z: 4.2 },\n color: visuals.harborWall,\n accent: 0.06,\n },\n {\n position: vec3(-5.7, 0.45, 1.4),\n rotationY: -0.08,\n scale: { x: 6.8, y: 0.3, z: 2.1 },\n color: visuals.harborDeck,\n accent: 0.04,\n },\n {\n position: vec3(-10.4, 0.28, 0.8),\n rotationY: 0.22,\n scale: { x: 1.2, y: 0.9, z: 1.2 },\n color: visuals.harborTower,\n accent: 0.02,\n },\n ];\n\n for (const object of harborObjects) {\n buildTrianglesFromMesh(\n UNIT_BOX_MESH,\n {\n position: object.position,\n rotationY: object.rotationY,\n scale: object.scale,\n },\n object.color,\n camera,\n viewport,\n triangles,\n object.accent\n );\n }\n}\n\nfunction renderShipRigging(ctx, ship, camera, viewport) {\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: 1.1 };\n const mastBase = transformPoint(vec3(0, 0.38, -0.4), transform);\n const mastTop = transformPoint(vec3(0, 3.8, -0.2), transform);\n const aftBase = transformPoint(vec3(-0.25, 0.32, -1.9), transform);\n const aftTop = transformPoint(vec3(-0.15, 2.7, -1.75), transform);\n const sailA = transformPoint(vec3(0.08, 3.2, -0.2), transform);\n const sailB = transformPoint(vec3(0.12, 1.2, -0.5), transform);\n const sailC = transformPoint(vec3(2.25, 2.25, 0.15), transform);\n const projected = [mastBase, mastTop, aftBase, aftTop, sailA, sailB, sailC].map((point) =>\n projectPoint(point, camera, viewport)\n );\n if (projected.some((value) => value === null)) {\n return;\n }\n\n ctx.strokeStyle = \"rgba(73, 54, 45, 0.94)\";\n ctx.lineWidth = 3.5;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n ctx.lineTo(projected[1].x, projected[1].y);\n ctx.moveTo(projected[2].x, projected[2].y);\n ctx.lineTo(projected[3].x, projected[3].y);\n ctx.stroke();\n\n ctx.fillStyle = \"rgba(238, 232, 214, 0.88)\";\n ctx.beginPath();\n ctx.moveTo(projected[4].x, projected[4].y);\n ctx.lineTo(projected[5].x, projected[5].y);\n ctx.lineTo(projected[6].x, projected[6].y);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction renderClothAccent(ctx, cloth, camera, viewport) {\n const projected = cloth.positions.map((point) => projectPoint(point, camera, viewport));\n ctx.strokeStyle = \"rgba(255, 241, 226, 0.92)\";\n ctx.lineWidth = 1.7;\n\n for (\n let row = 0;\n row < cloth.grid.rows;\n row += Math.max(1, Math.floor(cloth.grid.rows / 5))\n ) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < cloth.grid.cols; column += 1) {\n const point = projected[row * cloth.grid.cols + column];\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n\n const borderIndices = [\n 0,\n cloth.grid.cols - 1,\n cloth.grid.rows * cloth.grid.cols - 1,\n (cloth.grid.rows - 1) * cloth.grid.cols,\n ];\n ctx.fillStyle = colorToRgba(cloth.color, 0.95);\n for (const index of borderIndices) {\n const point = projected[index];\n if (!point) {\n continue;\n }\n ctx.beginPath();\n ctx.arc(point.x, point.y, 2.8, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderWaterHighlights(ctx, waterBands, camera, viewport) {\n for (const band of waterBands) {\n if (band.band === \"horizon\") {\n continue;\n }\n const interval = band.band === \"near\" ? 2 : 3;\n const alpha = band.band === \"near\" ? 0.22 : 0.14;\n ctx.strokeStyle = `rgba(232, 247, 255, ${alpha})`;\n ctx.lineWidth = band.band === \"near\" ? 1.3 : 0.9;\n for (let row = interval; row < band.rows - 1; row += interval) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < band.cols; column += 1) {\n const point = projectPoint(\n band.positions[row * band.cols + column],\n camera,\n viewport\n );\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n }\n}\n\nfunction spawnSpray(state, point, intensity) {\n const count = state.fluidDetail.getSnapshot().currentLevel.config.splashCount;\n for (let index = 0; index < count; index += 1) {\n const angle = (index / count) * Math.PI * 2;\n const speed = 0.9 + Math.random() * intensity * 0.45;\n state.sprays.push({\n position: vec3(point.x, point.y, point.z),\n velocity: vec3(Math.cos(angle) * speed * 0.35, 1.1 + Math.random() * 0.8, Math.sin(angle) * speed * 0.25),\n life: 1.2 + Math.random() * 0.4,\n });\n }\n}\n\nfunction updateShips(state, dt, shipModel) {\n const physics = shipModel.physics;\n const halfExtents = physics.halfExtents ?? [1.35, 0.95, 3.9];\n let collided = false;\n state.contactCount = 0;\n for (const ship of state.ships) {\n ship.position = addVec3(ship.position, scaleVec3(ship.velocity, dt));\n ship.rotationY += ship.angularVelocity * dt;\n ship.velocity = scaleVec3(ship.velocity, 1 - (physics.linearDamping ?? 0.04) * dt);\n ship.angularVelocity *= 1 - (physics.angularDamping ?? 0.08) * dt;\n ship.position.y =\n sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.22 +\n (physics.waterline ?? 0.42);\n if (Math.abs(ship.position.x) > 10) {\n ship.velocity.x *= -1;\n ship.angularVelocity *= -1;\n }\n if (ship.position.z < 2 || ship.position.z > 16) {\n ship.velocity.z *= -1;\n ship.angularVelocity *= -1;\n }\n }\n\n const [a, b] = state.ships;\n const dx = b.position.x - a.position.x;\n const dz = b.position.z - a.position.z;\n const overlapX = Math.abs(dx) < halfExtents[0] * 1.7;\n const overlapZ = Math.abs(dz) < halfExtents[2] * 0.8;\n if (overlapX && overlapZ) {\n const restitution = physics.restitution ?? 0.22;\n const swapX = a.velocity.x;\n const swapZ = a.velocity.z;\n a.velocity.x = -b.velocity.x * (0.86 + restitution);\n a.velocity.z = -b.velocity.z * (0.82 + restitution);\n b.velocity.x = -swapX * (0.86 + restitution);\n b.velocity.z = -swapZ * (0.82 + restitution);\n a.angularVelocity += 0.55;\n b.angularVelocity -= 0.55;\n const contactPoint = vec3((a.position.x + b.position.x) * 0.5, (a.position.y + b.position.y) * 0.5 + 0.1, (a.position.z + b.position.z) * 0.5);\n spawnSpray(state, contactPoint, Math.abs(dx) + Math.abs(dz));\n state.waveImpulses.push({\n x: contactPoint.x,\n z: contactPoint.z,\n strength: Math.min(1.4, 0.2 + (Math.abs(dx) + Math.abs(dz)) * 0.18),\n radius: 0.8,\n life: 1,\n });\n state.collisionCount += 1;\n state.contactCount = 1;\n collided = true;\n }\n state.collisionFlash = collided ? 1 : Math.max(0, state.collisionFlash - dt * 1.8);\n}\n\nfunction updateWaveImpulses(state, dt) {\n state.waveImpulses = state.waveImpulses\n .map((impulse) => ({\n ...impulse,\n life: impulse.life - dt * 0.55,\n }))\n .filter((impulse) => impulse.life > 0);\n}\n\nfunction updateSpray(state, dt) {\n state.sprays = state.sprays\n .map((particle) => {\n const nextVelocity = vec3(particle.velocity.x, particle.velocity.y - 4.2 * dt, particle.velocity.z);\n const nextPosition = addVec3(particle.position, scaleVec3(nextVelocity, dt));\n return {\n position: nextPosition,\n velocity: nextVelocity,\n life: particle.life - dt,\n };\n })\n .filter((particle) => particle.life > 0 && particle.position.y > -0.2);\n}\n\nfunction recordTelemetry(state, frameTimeMs) {\n const frameId = `showcase-${state.frame}`;\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: state.lightingDetail.getSnapshot(),\n };\n const synthetic = frameTimeMs + state.sprays.length * 0.1 + (state.stress ? 6.5 : 0);\n const decision = state.governor.recordFrame({ frameTimeMs: synthetic });\n const queueDepth = Math.min(32, Math.round(6 + state.sprays.length / 2 + (state.stress ? 10 : 0)));\n const readyLaneDepth = Math.min(\n 16,\n 4 + Math.round(Math.max(0, Math.sin(state.time * 1.7 + 0.8)) * 9)\n );\n state.debugSession.recordQueue({\n owner: \"renderer\",\n queueClass: \"render\",\n depth: queueDepth,\n capacity: 32,\n frameId,\n });\n state.debugSession.recordReadyLane({\n owner: \"lighting\",\n queueClass: \"lighting\",\n laneId: \"critical\",\n priority: 920,\n depth: readyLaneDepth,\n capacity: 16,\n frameId,\n });\n state.debugSession.recordDispatch({\n owner: \"lighting\",\n queueClass: \"lighting\",\n jobType: \"lighting.integration\",\n frameId,\n durationMs: quality.lighting.currentLevel.estimatedCostMs ?? 1.2,\n workgroups: { x: quality.fluid.currentLevel.config.nearResolution, y: 1, z: 1 },\n workgroupSize: { x: 8, y: 8, z: 1 },\n });\n state.debugSession.recordDependencyUnlock({\n owner: \"scene\",\n queueClass: \"render\",\n sourceJobType: \"physics.resolve\",\n unlockedJobType: \"lighting.integration\",\n priority: 920,\n unlockCount: 2 + Math.round(Math.max(0, Math.sin(state.time * 1.1)) * 4),\n frameId,\n });\n state.debugSession.recordPipelinePhase({\n owner: \"scene\",\n pipeline: \"scene-preparation\",\n stage: \"stable-visual-snapshot\",\n frameId,\n durationMs: synthetic * 0.38,\n snapshotAgeMs: Math.max(0, synthetic - 8),\n });\n state.debugSession.recordFrame({\n frameId,\n frameTimeMs: synthetic,\n targetFrameTimeMs: 16.67,\n gpuBusyMs: synthetic * 0.56,\n dropped: synthetic > 18,\n });\n return decision;\n}\n\nfunction renderSprays(ctx, sprays, camera, viewport) {\n for (const spray of sprays) {\n const projected = projectPoint(spray.position, camera, viewport);\n if (!projected) {\n continue;\n }\n const radius = clamp((1 / projected.depth) * 260, 1.5, 7.5);\n ctx.fillStyle = `rgba(225, 243, 250, ${clamp(spray.life / 1.6, 0, 0.9)})`;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderFlagPole(ctx, camera, viewport) {\n const base = projectPoint(vec3(-3.5, 0.7, 2.4), camera, viewport);\n const top = projectPoint(vec3(-3.5, 6.3, 2.4), camera, viewport);\n if (!base || !top) {\n return;\n }\n ctx.strokeStyle = \"rgba(77, 52, 41, 0.95)\";\n ctx.lineWidth = 6;\n ctx.beginPath();\n ctx.moveTo(base.x, base.y);\n ctx.lineTo(top.x, top.y);\n ctx.stroke();\n}\n\nfunction renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength) {\n const bounds = shipModel.bounds;\n const keelY = (shipModel.physics.waterline ?? 0.42) - 0.28;\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: 1.1 };\n const hullCorners = [\n vec3(bounds.min[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.max[2]),\n vec3(bounds.min[0], keelY, bounds.max[2]),\n ].map((point) => transformPoint(point, transform));\n\n renderProjectedShadow(ctx, hullCorners, camera, viewport, lightDir, {\n planeY: sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 - 0.03,\n alpha: 0.08 + shadowStrength * 0.2,\n blur: 14 + shadowStrength * 24,\n });\n}\n\nfunction renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength) {\n const clothPoints = [\n cloth.positions[0],\n cloth.positions[cloth.grid.cols - 1],\n cloth.positions[cloth.positions.length - 1],\n cloth.positions[cloth.positions.length - cloth.grid.cols],\n ];\n\n renderProjectedShadow(ctx, clothPoints, camera, viewport, lightDir, {\n planeY: 0.56,\n alpha: 0.05 + shadowStrength * 0.16,\n blur: 12 + shadowStrength * 20,\n });\n}\n\nfunction renderScene(ctx, canvas, state, shipModel, dom) {\n const viewport = { width: canvas.width, height: canvas.height };\n const camera = buildCamera(state, canvas);\n state.camera.eye = camera.eye;\n const lightingPlan = createLightingBandPlan({\n profile: state.focus === \"lighting\" ? defaultLightingProfile : getLightingProfile(defaultLightingProfile).name,\n importance: state.focus === \"lighting\" ? \"critical\" : \"high\",\n });\n const nearLighting = lightingPlan.bands.find((entry) => entry.band === \"near\") ?? lightingPlan.bands[0];\n const lightDir = normalizeVec3(vec3(-0.45, 0.85, -0.24));\n const lightingSnapshot = state.lightingDetail.getSnapshot();\n const visuals = resolveVisualConfig(\n nearLighting,\n lightingSnapshot,\n state.demoDescription?.visuals\n );\n state.demoVisuals = visuals;\n const reflectionStrength = visuals.reflectionStrength;\n const shadowStrength = visuals.shadowAccent;\n drawSkyAndShore(\n ctx,\n canvas,\n state,\n nearLighting,\n reflectionStrength,\n shadowStrength,\n visuals\n );\n\n const triangles = [];\n pushHarborGeometry(camera, viewport, triangles, visuals);\n const water = buildWaterBands(\n state,\n state.fluidDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (const bandMesh of water.bandMeshes) {\n const bandAccent = bandMesh.band === \"near\" ? 0.06 : bandMesh.band === \"mid\" ? 0.04 : 0;\n for (let index = 0; index < bandMesh.indices.length; index += 3) {\n const a = bandMesh.positions[bandMesh.indices[index]];\n const b = bandMesh.positions[bandMesh.indices[index + 1]];\n const c = bandMesh.positions[bandMesh.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: bandMesh.color,\n accent: bandAccent,\n });\n }\n }\n\n const cloth = buildClothSurface(\n state,\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (let index = 0; index < cloth.indices.length; index += 3) {\n const a = cloth.positions[cloth.indices[index]];\n const b = cloth.positions[cloth.indices[index + 1]];\n const c = cloth.positions[cloth.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: cloth.color,\n accent: cloth.band === \"near\" ? 0.1 : 0.04,\n });\n }\n\n for (const ship of state.ships) {\n buildTrianglesFromMesh(\n shipModel,\n { position: ship.position, rotationY: ship.rotationY, scale: 1.1 },\n ship.tint,\n camera,\n viewport,\n triangles,\n nearLighting.rtParticipation.directShadows === \"premium\" ? 0.08 : 0.02\n );\n }\n\n for (const ship of state.ships) {\n renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength);\n }\n renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength);\n\n drawTriangles(ctx, triangles, lightDir, reflectionStrength, camera, shadowStrength);\n renderWaterHighlights(ctx, water.bandMeshes, camera, viewport);\n renderFlagPole(ctx, camera, viewport);\n renderClothAccent(ctx, cloth, camera, viewport);\n for (const ship of state.ships) {\n renderShipRigging(ctx, ship, camera, viewport);\n }\n renderSprays(ctx, state.sprays, camera, viewport);\n\n const debugSnapshot = state.debugSession.getSnapshot();\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: lightingSnapshot,\n };\n\n const sceneMetrics = [\n `focus: ${state.focus}`,\n `ships: ${state.ships.length} active GLTF hulls`,\n `physics snapshot: ${state.physics.snapshot.stage} (${state.physics.snapshot.stability})`,\n `physics contacts: ${state.physics.snapshot.contactCount ?? 0}`,\n `cloth band: ${cloth.band} -> ${cloth.representation.output}`,\n `fluid near band: ${water.bandMeshes[0].representation.output}`,\n `lighting profile: ${lightingPlan.profile} (${lightingDistanceBands.length} bands)`,\n ];\n const qualityMetrics = [\n `fluid detail: ${quality.fluid.currentLevel.id} (${quality.fluid.currentLevel.config.nearResolution} near cells)`,\n `cloth detail: ${quality.cloth.currentLevel.id} (${quality.cloth.currentLevel.config.cols}x${quality.cloth.currentLevel.config.rows})`,\n `lighting detail: ${quality.lighting.currentLevel.id}`,\n `near shadows: ${nearLighting.primaryShadowSource}`,\n `near reflections: ${nearLighting.rtParticipation.reflections}`,\n `governor pressure: ${state.lastDecision.pressureLevel}`,\n `frame avg: ${state.lastDecision.metrics.averageFrameTimeMs.toFixed(2)} ms`,\n ];\n const debugMetrics = [\n `queue samples: ${debugSnapshot.queues.sampleCount}`,\n `dispatch avg: ${(debugSnapshot.dispatch.averageDurationMs ?? 0).toFixed(2)} ms`,\n `ready lane peak: ${debugSnapshot.dag.peakReadyLaneDepth.toFixed(1)}`,\n `pipeline samples: ${debugSnapshot.pipeline.sampleCount}`,\n `tracked memory: ${(debugSnapshot.memory.totalTrackedBytes / (1024 * 1024)).toFixed(1)} MB`,\n ];\n const sceneNotes =\n state.focus === \"physics\"\n ? [\n \"Stable world snapshots are taken after the authoritative rigid-body commit and before visual follow-up work.\",\n \"The ships collide on GLTF-derived hull volumes while cloth and fluid remain downstream visual consumers.\",\n \"Near-field lighting keeps the ray-traced-primary shadow impression so the collision read stays crisp.\",\n ]\n : SCENE_NOTES;\n const custom = state.demoDescription ?? null;\n\n setListContent(\n dom.sceneMetrics,\n Array.isArray(custom?.sceneMetrics) ? custom.sceneMetrics : sceneMetrics\n );\n setListContent(\n dom.qualityMetrics,\n Array.isArray(custom?.qualityMetrics) ? custom.qualityMetrics : qualityMetrics\n );\n setListContent(\n dom.debugMetrics,\n Array.isArray(custom?.debugMetrics) ? custom.debugMetrics : debugMetrics\n );\n setListContent(dom.sceneNotes, Array.isArray(custom?.notes) ? custom.notes : sceneNotes);\n\n dom.status.textContent =\n typeof custom?.status === \"string\"\n ? custom.status\n : `3D scene live · ${state.lastDecision.metrics.fps.toFixed(1)} FPS`;\n dom.details.textContent =\n typeof custom?.details === \"string\"\n ? custom.details\n : state.focus === \"physics\"\n ? `Stable world snapshots are emitted from ${state.physics.plan.snapshotStageId} after the authoritative solver; GLTF ships collide on ${shipModel.physics.shape ?? \"box\"} volumes while visual follow-up remains downstream.`\n : `GLTF ships are colliding with ${shipModel.physics.shape ?? \"box\"} physics volumes; cloth and fluid remain continuous while the governor pressure is ${state.lastDecision.pressureLevel}.`;\n}\n\nfunction updateSceneState(state, dt, shipModel) {\n updateShips(state, dt, shipModel);\n updateWaveImpulses(state, dt);\n updateSpray(state, dt);\n updatePhysicsSnapshot(state, shipModel);\n}\n\nfunction syncTextState(state, shipModel) {\n const snapshot = {\n coordinateSystem: \"right-handed world; +x right, +y up, +z forward from the shore\",\n focus: state.focus,\n stress: state.stress,\n ships: state.ships.map((ship) => ({\n id: ship.id,\n x: Number(ship.position.x.toFixed(2)),\n y: Number(ship.position.y.toFixed(2)),\n z: Number(ship.position.z.toFixed(2)),\n vx: Number(ship.velocity.x.toFixed(2)),\n vz: Number(ship.velocity.z.toFixed(2)),\n })),\n shipPhysics: shipModel.physics,\n sprays: state.sprays.length,\n waveImpulses: state.waveImpulses.length,\n pressure: state.lastDecision?.pressureLevel ?? \"stable\",\n physics: {\n profile: state.physics.profile,\n snapshotStageId: state.physics.plan.snapshotStageId,\n workerJobCount: state.physics.manifest.jobs.length,\n snapshot: state.physics.snapshot,\n },\n package: state.demoDescription?.textState ?? null,\n };\n window.render_game_to_text = () => JSON.stringify(snapshot);\n window.advanceTime = (ms) => {\n const step = Math.max(1, Math.round(ms / (1000 / 60)));\n for (let index = 0; index < step; index += 1) {\n state.frame += 1;\n state.time += 1 / 60;\n updateSceneState(state, 1 / 60, shipModel);\n state.lastDecision = recordTelemetry(state, 16.67 + (state.stress ? 6.5 : 0));\n }\n };\n}\n\nexport async function mountGpuShowcase(options = {}) {\n injectStyles();\n const root = options.root ?? document.body;\n const previousMarkup = root.innerHTML;\n const previousRenderGameToText = window.render_game_to_text;\n const previousAdvanceTime = window.advanceTime;\n const focus = options.focus ?? new URLSearchParams(window.location.search).get(\"focus\") ?? \"integrated\";\n const dom = buildDemoDom(root, {\n packageName: options.packageName ?? \"@plasius/gpu-demo-viewer\",\n title: options.title ?? DEFAULT_TITLE,\n subtitle: options.subtitle ?? DEFAULT_SUBTITLE,\n });\n dom.focusMode.value = focus;\n\n const state = createSceneState({ focus });\n const shipModel = await loadGltfModel(resolveShowcaseAssetUrl());\n state.shipModel = shipModel;\n state.packageState =\n typeof options.createState === \"function\" ? options.createState() : undefined;\n updatePhysicsSnapshot(state, shipModel);\n state.lastDecision = recordTelemetry(state, 16.4);\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n syncTextState(state, shipModel);\n\n const ctx = dom.canvas.getContext(\"2d\");\n let destroyed = false;\n let frameHandle = null;\n\n const renderFrame = (nowMs) => {\n if (destroyed) {\n return;\n }\n\n if (!state.paused) {\n if (state.lastTimeMs == null) {\n state.lastTimeMs = nowMs;\n }\n const dt = Math.min(0.033, (nowMs - state.lastTimeMs) / 1000);\n state.lastTimeMs = nowMs;\n state.time += dt;\n state.frame += 1;\n updateSceneState(state, dt, shipModel);\n updatePackageState(state, options, shipModel, dt);\n const syntheticFrame = 14.2 + state.sprays.length * 0.1 + (state.stress ? 6.4 : 0);\n state.lastDecision = recordTelemetry(state, syntheticFrame);\n }\n\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n renderScene(ctx, dom.canvas, state, shipModel, dom);\n syncTextState(state, shipModel);\n frameHandle = requestAnimationFrame(renderFrame);\n };\n\n const handlePauseClick = () => {\n state.paused = !state.paused;\n dom.pauseButton.textContent = state.paused ? \"Resume\" : \"Pause\";\n };\n const handleStressChange = () => {\n state.stress = dom.stressToggle.checked;\n };\n const handleFocusChange = () => {\n state.focus = dom.focusMode.value;\n Object.assign(state.camera, {\n ...CAMERA_PRESETS[state.focus],\n target: vec3(...CAMERA_PRESETS[state.focus].target),\n });\n };\n\n dom.pauseButton.addEventListener(\"click\", handlePauseClick);\n dom.stressToggle.addEventListener(\"change\", handleStressChange);\n dom.focusMode.addEventListener(\"change\", handleFocusChange);\n\n frameHandle = requestAnimationFrame(renderFrame);\n return {\n state,\n shipModel,\n canvas: dom.canvas,\n destroy() {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n if (frameHandle != null) {\n cancelAnimationFrame(frameHandle);\n }\n dom.pauseButton.removeEventListener(\"click\", handlePauseClick);\n dom.stressToggle.removeEventListener(\"change\", handleStressChange);\n dom.focusMode.removeEventListener(\"change\", handleFocusChange);\n root.innerHTML = previousMarkup;\n\n if (typeof previousRenderGameToText === \"function\") {\n window.render_game_to_text = previousRenderGameToText;\n } else {\n delete window.render_game_to_text;\n }\n\n if (typeof previousAdvanceTime === \"function\") {\n window.advanceTime = previousAdvanceTime;\n } else {\n delete window.advanceTime;\n }\n },\n };\n}\n\nfunction updatePhysicsSnapshot(state, shipModel) {\n state.physics.snapshot = createPhysicsWorldSnapshot({\n frameId: `showcase-${state.frame}`,\n tick: state.frame,\n simulationTimeMs: Number((state.time * 1000).toFixed(2)),\n profile: state.physics.profile,\n authoritativeTransformRevision: state.frame,\n secondarySimulationRevision: state.frame,\n animationInputRevision: state.frame,\n bodyCount: state.ships.length + 2,\n dynamicBodyCount: state.ships.length,\n contactCount: state.collisionFlash > 0.02 ? 1 : 0,\n metadata: {\n collisionCount: state.collisionCount,\n contactCount: state.contactCount,\n snapshotStageId: state.physics.plan.snapshotStageId,\n rigidBodyShape: shipModel.physics.shape ?? \"box\",\n },\n });\n}\n","export const showcaseFocusModes = Object.freeze([\n \"integrated\",\n \"lighting\",\n \"cloth\",\n \"fluid\",\n \"physics\",\n \"performance\",\n \"debug\",\n]);\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n}\n\nexport async function loadGltfModel(url) {\n const module = await import(\"./gltf-loader.js\");\n return module.loadGltfModel(url);\n}\n\nexport async function mountGpuShowcase(options = {}) {\n const runtimeLoader =\n typeof options.__runtimeLoader === \"function\"\n ? options.__runtimeLoader\n : () => import(\"./showcase-runtime.js\");\n const module = await runtimeLoader();\n if (typeof module.mountGpuShowcase !== \"function\") {\n throw new Error(\"showcase runtime loader must provide mountGpuShowcase.\");\n }\n\n const publicOptions = { ...options };\n delete publicOptions.__runtimeLoader;\n return module.mountGpuShowcase(publicOptions);\n}\n"],"mappings":"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","names":["document","assertIdentifier","assertFinitePositiveNumber","assertFiniteNonNegativeNumber","assertRatio","assertEnumValue","buildBandSettings","defaultBandInputs","normalizeThresholds","buildRepresentationDescriptor","profileRepresentationSpecs","createSimulationStage","simulationStageLabels","interactiveWorkerProfileSpec","cinematicWorkerProfileSpec","interactiveSimulationStages","cinematicSimulationStages","assertEnumValue","assertIdentifier","average","module","isRecord","assertIdentifier","IDENTIFIER_PATTERN","assertEnumValue","readPositiveNumber","readNonNegativeNumber","normalizePlainObject","isAbortSignalLike","assertIdentifier","buildWorkerBudgetLevels","baseUrl","import_meta","init_dist","loadGltfModel","mountGpuShowcase","resolveShowcaseAssetUrl","showcaseFocusModes","import_meta","baseUrl","module"]}
|